按另一列分组后,获取另一列分组的列的总和

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

如你所见,我正在尝试获取每个“方向”价格总和,并按“底部”进行分组。

4个回答

6
使用GROUP BYUnder列进行分组,并使用与SUM相关的CASE来获取所需的结果:
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

是的,我必须等待9分钟才能够。 - Stephen Gilboy

3
您可以使用PIVOT来实现此功能。(请参见SQL Fiddle演示)
select *
from 
(
    select under, price, side
    from executions
) x
PIVOT
(
    sum(price)
    for side in ([BUY], [SELL])
) p

使用Case和Pivot哪个更高效? - Stephen Gilboy
1
我刚看了一下两个执行计划,对于这个查询它们看起来大致相同,因为它们只有两列。通常我会使用 PIVOT 来处理这种类型的查询,因为你可以使它们具有动态性,这样你就不必为每个列编写代码。 - Taryn

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表达式,仅针对某些side值返回Price。 (注意:正如某些人不可避免地指出的那样,ELSE NULL是隐含的,可以省略。)

这不是唯一的方法。但如果您还需要获取每个sum中包含的行数以及所有行的计数,那么这是一种非常灵活的方法。为了说明这种方法的实施:

 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

这种方法通常具有非常可预测的性能,并且它要求源数据集仅被引用一次(在这种情况下,是一个简单的表引用)

这种方法适用于几乎所有关系型数据库。(Oracle、SQL Server、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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接