我有一张包含交易的表格。所有交易都存储为正数,如果存款或取款只有行动更改。如何编写一个可以根据操作总结数字的查询
-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
因此查询应显示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
我最初使用该查询时,我有正面/负面数字,并且工作得很好..但我现在不知道怎么做只有正数。
答案 0 :(得分:5)
应该这样做:
SELECT symbol, sum(case action
when 1 then shares
when 2 then -shares
end) as shares
FROM bf_transactions
GROUP BY symbol
这是一种很好的做法denormalize这类数据 - 您现在看来的是一个正确规范化的数据库,没有重复的数据,但使用它是相当不切实际的在这样的情况下可以看到。您应该保留一个单独的表格,其中包含您在执行交易时更新的当前股票投资组合。
另外,包括一个HAVING
- 条款来“隐藏”已损坏的数据(某人销售的数量超过了他们购买的数量)对我来说似乎是一种不太好的做法 - 当发现这样的情况时你绝对应该抛出一些错误或内部警报。