如何用SUM(CASE WHEN...)在SQL中根据布尔条件计数?
- 内容介绍
- 相关推荐
本文共计741个文字,预计阅读时间需要3分钟。
在SQL查询中,使用COUNT函数统计非NULL值时,直接使用COUNT(*)会统计所有行,包括NULL值。若要仅统计满足特定条件的行数,可以使用COUNT表达式。
例如,统计状态为'active'的记录数,可以使用以下SQL语句:
SUM(CASE WHEN ...) 是最通用的跨数据库解法
核心思路:把满足条件的行转成 1,不满足的转成 0,再用 SUM() 累加。这比 COUNT() 更可控,且所有主流数据库都支持。
- 写法固定:
SUM(CASE WHEN condition THEN 1 ELSE 0 END) - 避免漏掉
ELSE 0:如果省略,不满足条件的行会变成 NULL,SUM()会跳过它们(结果偏小) - 别用
COUNT(CASE WHEN ... THEN 1 END):它只统计“有 1 的行”,等价于COUNT(*)减去不满足的行数,但语义绕、易误解 - 示例:统计已支付订单数
SUM(CASE WHEN paid_at IS NOT NULL THEN 1 ELSE 0 END)
替代方案对比:COUNT + NULL 处理 vs. SUM + CASE
有人用 COUNT(CASE WHEN condition THEN 1 END),它依赖隐式忽略 NULL 的行为。虽然结果常对,但逻辑是“数出满足条件的行”,不是“算满足条件的个数”——当字段本身可能为 NULL 时容易混淆。
本文共计741个文字,预计阅读时间需要3分钟。
在SQL查询中,使用COUNT函数统计非NULL值时,直接使用COUNT(*)会统计所有行,包括NULL值。若要仅统计满足特定条件的行数,可以使用COUNT表达式。
例如,统计状态为'active'的记录数,可以使用以下SQL语句:
SUM(CASE WHEN ...) 是最通用的跨数据库解法
核心思路:把满足条件的行转成 1,不满足的转成 0,再用 SUM() 累加。这比 COUNT() 更可控,且所有主流数据库都支持。
- 写法固定:
SUM(CASE WHEN condition THEN 1 ELSE 0 END) - 避免漏掉
ELSE 0:如果省略,不满足条件的行会变成 NULL,SUM()会跳过它们(结果偏小) - 别用
COUNT(CASE WHEN ... THEN 1 END):它只统计“有 1 的行”,等价于COUNT(*)减去不满足的行数,但语义绕、易误解 - 示例:统计已支付订单数
SUM(CASE WHEN paid_at IS NOT NULL THEN 1 ELSE 0 END)
替代方案对比:COUNT + NULL 处理 vs. SUM + CASE
有人用 COUNT(CASE WHEN condition THEN 1 END),它依赖隐式忽略 NULL 的行为。虽然结果常对,但逻辑是“数出满足条件的行”,不是“算满足条件的个数”——当字段本身可能为 NULL 时容易混淆。

