2013-05-26 51 views
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 

我最初使用查询时,我有正/负号码和伟大的工作..但我不知道如何只用正数现在就这样做。

回答

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这种类型的数据 - 你似乎什么现在已经是一个正确规范化的数据库没有重复的数据,但使用正如你在这种情况下看到的那样是不切实际的。您应该在交易执行时更新您当前更新的当前股票投资组合表。如果发现类似的情况,那么你肯定应该抛出一些错误,比如说,或内部警报。

+0

+1对于非常好用的小提琴链接markdown(因为你是正确的:)) – Bohemian

+0

赫赫看到别人今天这样做 - 马上查找降价,因为它比一个更好,更清洁真正的链接methinks :) –

+0

我只用它的实际*键*,但看起来真棒:) – Bohemian

相关问题