2013-05-26 74 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

相關問題