1

我有一张交易表。所有交易都存储为正数,如果其存款或取款仅操作发生变化。我如何编写一个可以根据操作总结数字的查询

-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

当我有正数/负数并且效果很好时,我最初使用该查询。但我现在不知道如何只使用正数。

4

1 回答 1

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

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

此外,包括一个HAVING“隐藏”损坏数据的 - 子句(有人卖的比他们买的多)对我来说似乎是一种不好的做法——当检测到这样的情况时,你肯定应该抛出某种错误或内部警报。

于 2013-05-26T22:37:05.830 回答