SQL如何高效统计分类下的多项指标_善用CASE WHEN与SUM聚合
应优先用SUM(CASE WHEN...)而非COUNT做条件计数因其能返回0而非跳过NULL多指标须共用同一CASE结构以避免重复扫描GROUP BY字段须与SELECT中非聚合字段严格一致需警惕源字段NULL及JOIN后NULL导致的指标归零。为什么不用COUNT而要用SUM(CASE WHEN ...)因为 COUNT 会把 NULL 当作“不存在”直接跳过而分类统计时你往往需要“0”这个明确数值——比如某类用户没下单就得显示 0 而不是漏掉一行。用 SUM(CASE WHEN condition THEN 1 ELSE 0 END) 才能确保每个分组都产出确定值。常见错误现象COUNT(CASE WHEN status paid THEN 1 END) 会把未满足条件的行算作 NULL最终被 COUNT 忽略结果偏小。永远优先用 SUM(CASE ...) 做条件计数除非你明确想排除空值COUNT(*) 只适合统计总行数不参与条件分支MySQL 中 BOOL 表达式可直接进 SUM如 SUM(status paid)但 PostgreSQL/SQL Server 不支持跨库慎用多个指标共用一个CASE WHEN还是分开写必须共用——即在一个 SUM(CASE WHEN ...) 里嵌套多组逻辑而不是对同一字段反复 CASE。否则扫描次数翻倍执行计划里 Seq Scan 或 Index Scan 会重复触发。使用场景统计「支付金额」「订单数」「新客数」三个指标都基于 orders 表且需按 category 分组。错误写法SUM(CASE WHEN paid THEN amount END)、COUNT(CASE WHEN paid THEN 1 END)、COUNT(CASE WHEN is_new THEN 1 END) —— 看似清晰实际让优化器难以合并扫描。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。