You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:59:04