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

无GROUP BY语法下按ID汇总特定条件值的SQL实现求助

解决CASE语句内按ID+YN='Y'求和的问题

嘿,我来帮你修正这个SQL问题!你的核心需求是:对同一ID下所有YN='Y'的记录计算Value总和,同时保留YN='N'记录的原始Value值,而且不能用GROUP BY来合并行对吧?

原SQL的问题

你写的子查询 select sum(Value) from T group by ID 会返回多行结果(比如你的示例里会返回ID1的10和ID2的3),但CASE表达式需要的是单个标量值,所以这个写法会直接报错“子查询返回多于一行”,这就是问题所在。

修正方案1:关联子查询(最直观)

用关联子查询针对每一行的ID,单独计算该ID下YN='Y'的Value总和,完美适配CASE的要求:

SELECT 
    CASE 
        WHEN t1.YN = 'Y' THEN (SELECT SUM(t2.Value) FROM T t2 WHERE t2.ID = t1.ID AND t2.YN = 'Y')
        ELSE t1.Value 
    END AS TotalResult
FROM T t1;

这个方案的好处是逻辑清晰,只计算符合YN='Y'条件的记录之和,不会把同ID下YN='N'的Value算进去。

修正方案2:窗口函数(更高效)

如果你用的是支持窗口函数的数据库(比如MySQL 8+、PostgreSQL、SQL Server等),窗口函数是更高效的选择,它不用重复查询表,直接在一行里计算分组聚合值:

SELECT 
    CASE 
        WHEN YN = 'Y' THEN SUM(CASE WHEN YN='Y' THEN Value ELSE 0 END) OVER (PARTITION BY ID)
        ELSE Value 
    END AS TotalResult
FROM T;

这里SUM(...) OVER (PARTITION BY ID)会为每一行计算其所属ID分组内,所有YN='Y'的Value总和,既不用GROUP BY合并行,又能得到正确的求和结果。

示例输出

针对你给出的测试数据,两个方案都会返回:

TotalResult
10
10
3

内容的提问来源于stack exchange,提问作者Wael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:35