基于两列对行进行分组并包括聚合列

Grouping Rows based on two columns and including an aggregated column

抱歉很难创建一个描述性主题,但这里是对我正在尝试做的事情的解释:

这是我拥有的数据的形状:

所以对于每一组EffectiveDates,如果有多行相同的SecGlobalId并且它们的SecType只是“CASH " ,我想合并他们的 Cost 的总和,并且只为那些 ONE 行,所以例如对于 24th 我想为 USD 设置一行,它的值成本列为 23.45 + 10.00 = 33.45,然后是第 25 列的另一列为 140.23 + 45.41

这是我创建的示例脚本,我尝试进行分组,但这是不对的。所以我不确定还有什么办法可以解决它。

CREATE TABLE #Practice
(
    SecGlobalID INT, 
    Name NVARCHAR(50), 
    EffectiveDate DATE,  
    Cost DECIMAL(20,2), 
    SecType NVARCHAR(5)
);

INSERT INTO #Practice (SecGlobalID, Name, Cost, EffectiveDate, SecType)
VALUES 
 (1234, 'USD', 23.45,  '2021-07-24', 'CASH')
 ,(1234, 'USD', 10.00,  '2021-07-24', 'CASH')
 ,(789, 'Tesla', 564.72,  '2021-07-24', 'STOCK')
 ,(5223, 'Starbucks', 4534.12,  '2021-07-24', 'STOCK')
 ,(9987, 'GER', 50.00,  '2021-07-24', 'CASH')

 ,(1234, 'USD', 140.23,  '2021-07-25', 'CASH')
 ,(1234, 'USD', 45.41,  '2021-07-25', 'CASH')
 ,(9987, 'GER', 5.4,  '2021-07-25', 'CASH')

 ,(43342, 'Security1', 3670.14,  '2021-07-26', 'STOCK')
 ,(7777, 'Security2', 66.35,  '2021-07-26', 'CASH')
 
SELECT SecGlobalID, Name, EffectiveDate, SUM(Cost), SecType 
FROM #Practice
GROUP BY SecGlobalID, Name, EffectiveDate,  SecType

DROP TABLE #Practice

所以这是预期结果的屏幕截图:

SELECT SecGlobalID, Name, EffectiveDate, SUM(CASE WHEN SecType= 'CASH' THEN Cost ELSE 0 END), SecType 
FROM #Practice
GROUP BY SecGlobalID, Name, EffectiveDate,  SecType
Order by EffectiveDate

您可以在 CASE 表达式中使用 SUM() window 函数:

SELECT DISTINCT
       SecGlobalID, Name, 
       CASE 
         WHEN SecType <> 'CASH' THEN Cost
         ELSE SUM(CASE WHEN SecType = 'CASH' THEN Cost END) OVER (PARTITION BY SecGlobalID, EffectiveDate) 
       END Cost, 
       EffectiveDate, SecType
FROM Practice

参见demo