SQL条件聚合统计不同状态数量的方法与示例
时间:2026-08-21 | 作者:火苗实验室 | 阅读:0应使用 CASE WHEN 套在聚合函数中实现条件统计,因其只需单次扫描、避免多次查询的网络开销与数据不一致,支持一行多桶计算,并能同句返回总览与分项结果。
直接回答:用 CASE WHEN 套在聚合函数里,而不是写多个 WHERE 子句或拆成多条查询。
为什么不能用 WHERE 分多次查
有人会这么想,“查待审核数量”就是执行SELECT COUNT(*) FROM t WHERE status = 'pending',“查已通过数量”再执行一条SELECT COUNT(*) FROM t WHERE status = 'approved'……如此一来,查询5个状态就得发送5次请求,网络开销直接翻倍,而且还容易因为中间数据的变更导致统计口径不一致。
更关键的是,WHERE 是在分组前过滤整行,没法让一行同时参与多个统计维度 —— 而条件聚合的本质,是让同一行根据不同逻辑“算进不同桶里”。
- 每条记录只扫描一次,性能更好
- 结果在同一行返回,便于比对(比如“通过率 = approved / total”)
- 避免并发更新导致的统计漂移
CASE WHEN + COUNT/SUM 的标准写法
核心模式其实就这么一种:COUNT(CASE WHEN condition THEN 1 END) 或者 SUM(CASE WHEN condition THEN 1 ELSE 0 END)。这两种写法在语义上是一样的,但通常来说,COUNT 的写法会更常见一些。为什么呢?因为 COUNT 函数在处理数据时,会自动忽略 NULL 值,这样就可以省掉 ELSE 0 这部分了。
示例:统计订单表中各状态数量
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'created' THEN 1 END) AS created_cnt,
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_cnt,
COUNT(CASE WHEN status IN ('shipped', 'delivered') THEN 1 END) AS shipped_cnt,
COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled_cnt
FROM orders;
注意点:
CASE WHEN后面不要跟ELSE—— 留空即为NULL,COUNT自动跳过- 用
IN合并多个值比写多个OR更清晰、也更易读 - 字段名别用引号包裹(除非含特殊字符),MySQL/PostgreSQL/SQL Server 都支持裸名
HA VING 不能替代条件聚合
有人误以为 HA VING 能筛出“某状态数量 > 100”的组,就等于做了条件统计 —— 不对。HA VING 是对 GROUP BY 后的分组结果做筛选,它本身不生成新列。
比如下面这段代码:
SELECT status, COUNT(*) FROM orders GROUP BY status HA VING COUNT(*) > 100;
它只返回那些“数量超 100”的状态及其总数,但不会告诉你总共有多少订单、其他状态有多少——你依然缺一个全局基准值。
真正需要的是:同一查询里既有分组明细,又有跨状态的条件汇总(比如“已支付订单占总量的百分比”),这时候必须靠 CASE WHEN 在 SELECT 里展开计算。
兼容性与性能提醒
所有主流数据库(MySQL 5.7+、PostgreSQL、SQL Server、Oracle、SQLite 3.8+)都支持这种写法,语法完全一致,无需改写。
唯一容易踩的坑是 NULL 处理:
- 如果
status字段允许为NULL,且你想单独统计NULL数量,得显式写COUNT(CASE WHEN status IS NULL THEN 1 END) - 别用
= NULL判断,必须用IS NULL - 聚合函数里混用
NULL和数字时,确保逻辑无歧义(比如SUM遇到NULL直接忽略,不影响结果)
实际执行时,优化器通常能把这种写法压成单次全表扫描,和最朴素的 SELECT COUNT(*) 开销接近——只要没在 CASE 里调用复杂函数或子查询。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
