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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:18:36