bra*_*ner 1 mysql sql case aggregate-functions
我有一张交易表.所有交易都存储为正数,如果存款或取款只有行动更改.如何编写可以根据操作总结数字的查询
-actions- 1买2卖5股息
ID ACTION SYMBOL PRICE SHARES
1 1 AGNC 27.50 150
2 2 AGNC 30.00 50
3 5 AGNC 1.25 100
Run Code Online (Sandbox Code Playgroud)
因此查询应显示AGNC共有100个共享.
SELECT
symbol,sum(shares) AS shares,
ROUND(abs(sum((price * shares))),2) AS cost,
FROM bf_transactions
WHERE (action_id <> 5)
GROUP BY symbol
HAVING sum(shares) > 0
Run Code Online (Sandbox Code Playgroud)
我最初使用该查询时,我有正数/负数,并且工作得很好..但我现在不知道怎么做只有正数.
这应该这样做:
SELECT symbol, sum(case action
when 1 then shares
when 2 then -shares
end) as shares
FROM bf_transactions
GROUP BY symbol
Run Code Online (Sandbox Code Playgroud)
然而,对这种数据进行非规范化是一种很好的做法- 你现在看来的是一个没有重复数据的正确规范化的数据库,但使用它是相当不切实际的,正如你在这种情况下看到的那样.您应该保留一个单独的表格,其中包含您在执行交易时更新的当前股票投资组合.
此外,包括一个HAVING"隐藏"已损坏数据的声明(某人销售的数量超过他们购买的数量)对我来说似乎是一种不太好的做法 - 当检测到这样的情况时,你肯定会抛出某种错误或内部警报.