最稳妥写法是SUM(CASE WHEN condition THEN value ELSE 0 END);漏写ELSE会导致不匹配行返回NULL,而SUM自动忽略NULL,造成结果偏小且难排查。

SQL里SUM(CASE WHEN ...)到底怎么写才不出错
直接说结论:用 SUM(CASE WHEN condition THEN value ELSE 0 END) 是最稳妥的写法,ELSE NULL 或省略 ELSE 都会导致该行贡献为 NULL,而 SUM 会跳过 NULL——这看起来像“正常”,但一旦漏掉 ELSE 0,在聚合逻辑复杂时极易引发结果偏小且难以排查。
CASE WHEN里漏写ELSE 0会怎样
现象是:本该计入求和的某些行“消失”了。因为 CASE WHEN 没匹配到条件又没写 ELSE,默认返回 NULL;SUM 对 NULL 值完全忽略,不报错也不警告。
-
SUM(CASE WHEN status = 'paid' THEN amount END)→ 所有status != 'paid'的行都算作NULL,不参与求和 -
SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END)→ 其他行明确加 0,结果可预期 - 如果字段
amount本身可能为NULL,还要额外处理:COALESCE(amount, 0)
多个条件求和要避免嵌套CASE
别写 SUM(CASE WHEN a THEN CASE WHEN b THEN x END END)——可读性差、易漏分支、维护成本高。同一层级用多个独立 CASE 更清晰:
SELECT SUM(CASE WHEN region = 'CN' AND status = 'active' THEN sales ELSE 0 END) AS cn_active, SUM(CASE WHEN region = 'US' AND status = 'active' THEN sales ELSE 0 END) AS us_active, SUM(CASE WHEN status = 'cancelled' THEN sales ELSE 0 END) AS cancelled FROM orders;
这种写法每列语义独立,加新维度(比如按年份拆)只需复制一行改条件,不用动结构。
WHERE过滤和CASE WHEN求和的区别在哪
关键区别在作用时机:WHERE 是在分组前筛行,CASE WHEN 是在分组内做条件转换。比如要统计“总订单数”和“已支付订单数”两个指标,必须用 CASE:
-
WHERE status = 'paid'→ 只能拿到已支付部分的总数,丢失整体基数 -
COUNT(*)和COUNT(CASE WHEN status = 'paid' THEN 1 END)→ 同一次扫描就出两个数 - 性能上,单次扫描 + 条件分支通常优于多次子查询或
UNION
真正容易被忽略的是:当需要同时满足「全局聚合」+「条件细分」时,CASE WHEN 不是语法糖,而是不可替代的语义表达方式。

















