2012-06-26 52 views
4

我一直在嘗試一段時間來弄清楚這一點,但是我缺乏更高級的SQL技能讓我失望。獲得按另一列分組的列的總和,然後分組到另一列

Executions(TradeDate, Symbol, Side, Price, Under, Account) 

TEMP DATA: 
2012-06-20, AAPL 120716C00600000, BUY, 3.25, AAPL, XYZ123 
2012-06-20, AAPL 120716C00600000, SELL, 3.30, AAPL, XYZ123 
2012-06-20, AAPL 120716C00600000, BUY, 3.25, AAPL, XYZ123 
2012-06-20, AAPL 120716C00600000, SELL, 3.30, AAPL, XYZ123 
2012-06-20, GRPN 120716C00027000, BUY, 2.25, GRPN, XYZ123 
2012-06-20, GRPN 120716C00027000, SELL, 2.30, GRPN, XYZ123 
2012-06-20, GRPN 120716C00027000, SELL, 2.30, GRPN, XYZ123 
2012-06-20, GRPN 120716C00027000, BUY, 2.25, GRPN, XYZ123 


-UNDER----Side(Buy)----Side(Sell) 
AAPL  6.50   6.60 
GRPN  4.50   4.60 

正如你所看到的,我試圖得到每邊的價格總和,然後由下分組。

回答

6

使用GROUP BY到組由Under柱和CASESUM相關聯,以獲得所需結果:

SELECT e.Under, 
     SUM(case when e.Side = 'BUY' them e.Price else 0 end) as 'Side(Buy)', 
     SUM(case when e.Side = 'SELL' them e.Price else 0 end) as 'Side(Sell)' 
FROM Executions e 
GROUP BY e.Under 
+0

謝謝,我感謝您的幫助 – Stephen

+0

@Stephen如果一切正常,你應該接受的答案。 –

+0

是的,我不得不等待9分鐘。 – Stephen

0

這裏有一個辦法:

SELECT e.under 
    , SUM(CASE WHEN e.side = 'BUY' THEN e.price ELSE NULL END) AS [Side(Buy)] 
    , SUM(CASE WHEN e.side = 'SELL' THEN e.price ELSE NULL END) AS [Side(Sell)] 
    FROM Executions e 
GROUP BY e.under 

的 「絕招」 這裏是使用CASE表達式僅返回一定數值的邊的價格。 (注意:由於有人不可避免地指出,ELSE NULL是隱含的,可以省略。)

這不是唯一的方法。但是,如果您還需要獲得每個總和中包含的行的「計數」以及所有行的計數,那麼這是一種靈活的方法,效果很好。爲了說明這種方法被行使:

SELECT e.under 
    , SUM(CASE WHEN e.side = 'BUY' THEN e.price ELSE NULL END) AS [SUM_Side(Buy)] 
    , SUM(CASE WHEN e.side = 'BUY' THEN 1  ELSE 0 END) AS [COUNT_Side(Buy)] 
    , SUM(CASE WHEN e.side = 'SELL' THEN e.price ELSE NULL END) AS [SUM_Side(Sell)] 
    , SUM(CASE WHEN e.side = 'SELL' THEN 1  ELSE 0 END) AS [COUNT_Side(Sell)] 
    , SUM(CASE WHEN e.side IN ('BUY','SELL') THEN 1 ELSE 0 END) AS [COUNT_(Buy+Sell)] 
    FROM Executions e 
GROUP BY e.under 

這種方法通常具有非常可預測的性能,並且它要求源數據集只進行一次引用(在這種情況下,一個簡單的表參考)

這種方法適用幾乎在每個關係數據庫中。 (甲骨文,SQL服務器,MySQL和Teradata的,DB2,...)

0
select Symbol, sum(case when side = 'BUY' THEN Price else 0 END) as [Side(Buy)], sum(case when side = 'SELL' THEN Price else 0 END) as [Side(Sell)] group by Symbol 
3

你可以使用這個PIVOT。 (見SQL Fiddle for Demo

select * 
from 
(
    select under, price, side 
    from executions 
) x 
PIVOT 
(
    sum(price) 
    for side in ([BUY], [SELL]) 
) p 
+0

使用Case或Pivot更有效嗎? – Stephen

+1

我只是看了兩個執行計劃,他們出現大約相同的查詢,因爲只有兩列。我通常使用'PIVOT'來處理這些類型的查詢,因爲你可以使它們變成動態的,所以你不必爲每一列編寫代碼。 – Taryn

相關問題