Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取由另一列分组后再分组到另一列的列的总和_Sql_Sql Server_Sql Server 2008_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql 获取由另一列分组后再分组到另一列的列的总和

Sql 获取由另一列分组后再分组到另一列的列的总和,sql,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我已经尝试了一段时间来解决这个问题,但我缺乏更高级的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 12071

我已经尝试了一段时间来解决这个问题,但我缺乏更高级的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

正如您所看到的,我正在尝试获取每一方的价格总和,然后按下面的分组。

使用
分组依据
分组依据
列和与
总和
关联的
案例
,以获得所需的结果:

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
这里有一种方法:

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的某些值的价格。 (注意:正如有人不可避免地指出的那样,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
这种方法通常具有非常可预测的性能,并且它要求源数据集只被引用一次(在本例中,是一个简单的表引用)

这种方法几乎适用于所有关系数据库。(Oracle、SQL Server、MySQL、Teradata、DB2等)

您可以使用。(见附件)


谢谢,我感谢你的帮助是的,我不得不等了9分钟才可以。使用Case或Pivot哪个更有效?我刚刚查看了两者的执行计划,它们在这个查询中看起来几乎相同,因为只有两列。对于这些类型的查询,我通常使用
PIVOT
,因为您可以使它们成为动态的,所以不必为每一列编写代码。
 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
select *
from 
(
    select under, price, side
    from executions
) x
PIVOT
(
    sum(price)
    for side in ([BUY], [SELL])
) p