如何用SUM(CASE WHEN...)在SQL中根据布尔条件计数?

2026-04-27 21:390阅读0评论SEO问题
  • 内容介绍
  • 相关推荐

本文共计741个文字,预计阅读时间需要3分钟。

如何用SUM(CASE WHEN...)在SQL中根据布尔条件计数?

在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分钟。

如何用SUM(CASE WHEN...)在SQL中根据布尔条件计数?

在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 时容易混淆。

阅读全文