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

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)

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

Nie*_*jes 5

这应该这样做:

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)

SQL Fiddle here

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

此外,包括一个HAVING"隐藏"已损坏数据的声明(某人销售的数量超过他们购买的数量)对我来说似乎是一种不太好的做法 - 当检测到这样的情况时,你肯定会抛出某种错误或内部警报.