SQL技术问询:按EffectiveDate与SecGlobalID分组聚合CASH类型数据的Cost列
解决方案:仅合并CASH类型的重复记录
嘿,我看出来你的问题在哪了——你当前的GROUP BY会把所有类型的记录都分组合并,但你的需求是仅针对SecType = 'CASH'的行做合并求和,其他类型(比如STOCK)得保留原始的每一条记录对吧?
正确的SQL实现
我们可以用UNION ALL把两部分数据组合起来:一部分处理需要合并的CASH记录,另一部分直接返回非CASH的原始记录,这样就能精准满足你的需求。
完整代码如下:
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') -- 第一部分:处理CASH类型,分组求和 SELECT SecGlobalID, Name, EffectiveDate, SUM(Cost) AS Cost, SecType FROM #Practice WHERE SecType = 'CASH' GROUP BY SecGlobalID, Name, EffectiveDate, SecType -- 第二部分:直接返回非CASH类型的原始记录 UNION ALL SELECT SecGlobalID, Name, EffectiveDate, Cost, SecType FROM #Practice WHERE SecType != 'CASH' -- 按日期和类型排序,方便查看 ORDER BY EffectiveDate, SecType DESC, SecGlobalID DROP TABLE #Practice
预期结果验证
执行这段代码后,你会得到完全符合需求的结果:
- 2021-07-24的USD(CASH)记录合并为1条,Cost为
23.45 + 10.00 = 33.45 - 2021-07-25的USD(CASH)记录合并为1条,Cost为
140.23 + 45.41 = 185.64 - 所有STOCK类型的记录都保留了原始行,没有被合并
原脚本的问题所在
你的原SQL没有添加SecType = 'CASH'的过滤条件,导致GROUP BY会对所有类型的记录执行分组操作。如果后续出现同一EffectiveDate、SecGlobalID下的多条STOCK记录,它们也会被合并,这显然不符合你的需求。通过拆分两部分处理,我们确保只有CASH类型的记录被合并求和,其他类型保持原样。
内容的提问来源于stack exchange,提问作者UnskilledCoder
相关产品推荐
相关产品推荐

