SQL中如何强制两行合并求和而非拼接?
解决AutoDel分组求和的问题
嘿,我完全懂你的困扰——你希望把AutoDel值为90的两行合并求和,同时保留AutoDel(90)和DaysActive(89)的固定值,但因为GROUP BY子句里包含了el.RemoveAfter和s.AutoDeleteDays这两个实际值不同的列,导致SQL把它们当成了不同的分组,没法合并。咱们直接从根源解决这个问题:
核心思路
问题出在分组依据和你想要的结果不匹配。你要的是按AutoDel和DaysActive分组,而不是按生成AutoDel的原始列(el.RemoveAfter/s.AutoDeleteDays)分组。所以只要让GROUP BY的对象变成你最终需要的AutoDel和DaysActive,就能强制合并相同值的行。
具体解决方案
方案1:直接在GROUP BY中使用AutoDel的计算逻辑
把原来GROUP BY里的el.RemoveAfter和s.AutoDeleteDays替换成生成AutoDel的CASE表达式,这样SQL就会按最终的AutoDel值来分组:
SELECT -- 保持你原来的AutoDel计算逻辑 CASE WHEN el.RemoveAfter IS NOT NULL THEN el.RemoveAfter ELSE s.AutoDeleteDays END AS AutoDel, DaysActive, -- 对需要求和的列使用SUM() SUM(YourColumn1) AS TotalColumn1, SUM(YourColumn2) AS TotalColumn2, SUM(YourColumn3) AS TotalColumn3 FROM YourTableName -- 分组依据改成AutoDel的计算式 + DaysActive GROUP BY CASE WHEN el.RemoveAfter IS NOT NULL THEN el.RemoveAfter ELSE s.AutoDeleteDays END, DaysActive;
方案2:用CTE先统一AutoDel值,再分组
如果觉得CASE表达式在GROUP BY里重复写太繁琐,可以先用CTE把AutoDel计算好,再基于CTE分组,代码可读性更高:
WITH AutoDelData AS ( SELECT CASE WHEN el.RemoveAfter IS NOT NULL THEN el.RemoveAfter ELSE s.AutoDeleteDays END AS AutoDel, DaysActive, YourColumn1, YourColumn2, YourColumn3 FROM YourTableName ) SELECT AutoDel, DaysActive, SUM(YourColumn1) AS TotalColumn1, SUM(YourColumn2) AS TotalColumn2, SUM(YourColumn3) AS TotalColumn3 FROM AutoDelData GROUP BY AutoDel, DaysActive;
关键注意点
- 确保
DaysActive在AutoDel=90的所有行里都是89(或者你需要固定的那个值),如果DaysActive有不同值,GROUP BY会把它们拆成不同组。如果遇到这种情况,你可以对DaysActive用聚合函数(比如MAX(DaysActive)或MIN(DaysActive))来固定值,同时GROUP BY里只保留AutoDel。 - 所有不需要固定的列,都要使用
SUM()(或者其他聚合函数,比如COUNT()/AVG(),根据你的需求),不能直接放在SELECT里而不处理。
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

