根据其他字段的内容添加或减去值

时间:2013-05-26 22:33:50

标签: 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

因此查询应显示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

我最初使用该查询时,我有正面/负面数字,并且工作得很好..但我现在不知道怎么做只有正数。

1 个答案:

答案 0 :(得分:5)

应该这样做:

SELECT symbol, sum(case action
    when 1 then shares
    when 2 then -shares
    end) as shares
FROM bf_transactions 
GROUP BY symbol

SQL Fiddle here

这是一种很好的做法denormalize这类数据 - 您现在看来的是一个正确规范化的数据库,没有重复的数据,但使用它是相当不切实际的在这样的情况下可以看到。您应该保留一个单独的表格,其中包含您在执行交易时更新的当前股票投资组合。

另外,包括一个HAVING - 条款来“隐藏”已损坏的数据(某人销售的数量超过了他们购买的数量)对我来说似乎是一种不太好的做法 - 当发现这样的情况时你绝对应该抛出一些错误或内部警报。