SQL实现SUMIF/CASE WHEN按行值条件分组求和 匹配Excel SUMIFS效果
错误原因分析
你原代码的问题出在CASE WHEN B>=B的判断逻辑:这里左右两侧的B都是取当前行的B字段值,条件永远为真,最终SUM返回的是整个A分组所有C值的总和,不符合要求的筛选逻辑。
正确SQL写法
写法1:窗口函数(性能最优,推荐主流SQL引擎使用)
利用窗口函数的排序+帧范围定义实现需求:
SELECT A, B, C, SUM(C) OVER( PARTITION BY A ORDER BY B DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS Output FROM 你的表名
逻辑说明:
- 按A列分组
- 分组内按B值降序排序
- 从分组第一行到当前行累计求和C值,正好对应「分组内所有B≥当前行B的C值之和」的需求
Hive、Spark SQL、PostgreSQL等主流引擎省略帧定义时,ORDER BY后的默认帧规则也匹配需求,可简写为:
SUM(C) OVER(PARTITION BY A ORDER BY B DESC) AS Output
写法2:相关子查询(兼容所有SQL版本)
如果你的数据库不支持窗口函数,可以用相关子查询实现:
SELECT t1.A, t1.B, t1.C, (SELECT SUM(t2.C) FROM 你的表名 t2 WHERE t2.A = t1.A AND t2.B >= t1.B) AS Output FROM 你的表名 t1
验证结果
两种写法对测试输入的返回结果和预期完全一致:
| A | B | C | Output |
|---|---|---|---|
| 1 | 1 | 1 | 3 |
| 1 | 2 | 1 | 2 |
| 1 | 3 | 1 | 1 |
| 2 | 1 | 0 | 1 |
| 2 | 2 | 1 | 1 |
| 2 | 3 | 0 | 0 |
内容的提问来源于stack exchange,提问作者16143
相关产品推荐
相关产品推荐

