基于两列对行进行分组并包括聚合列
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。
抱歉很难创建一个描述性主题,但这里是对我正在尝试做的事情的解释:
这是我拥有的数据的形状:
所以对于每一组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。