如何在同一条SQL查询语句中实现多个带不同条件的count统计?
多条件COUNT统计的最优实现方案
完全不需要用UNION拼接多个查询,最高效优雅的实现方式是条件聚合,仅需扫描一次表即可返回所有维度的统计结果。
核心实现思路
利用COUNT函数会忽略NULL值的特性,在聚合函数内通过CASE WHEN判断统计条件,仅符合条件的行才会被计数。
通用兼容写法(支持所有主流SQL数据库)
SELECT -- 统计满足第一组条件的行数 COUNT(CASE WHEN <第一组条件> THEN 1 END) AS First, -- 统计满足第二组条件的行数 COUNT(CASE WHEN <第二组条件> THEN 1 END) AS Second FROM `table` -- 可加公共过滤条件,减少扫描数据量 WHERE <两组统计都需要满足的公共条件>;
你也可以用SUM函数替代实现,逻辑等价:
SUM(CASE WHEN <条件> THEN 1 ELSE 0 END) AS 统计量
方言简化写法(支持PostgreSQL、SQLite 3.30+、BigQuery等)
部分数据库支持标准SQL的FILTER语法,可读性更强:
SELECT COUNT(*) FILTER (WHERE <第一组条件>) AS First, COUNT(*) FILTER (WHERE <第二组条件>) AS Second FROM `table`;
方案优势对比
- 效率远高于UNION方案:仅需扫描1次表,UNION需要为每个COUNT查询单独扫描一次表,数据量越大性能差距越明显
- 结果格式友好:直接返回单行多列的统计结果,无需额外做行转列处理
- 扩展性强:如果需要新增其他维度的统计,只需加新的聚合列即可,不需要修改整体查询结构
- 支持分组统计:如果需要按维度拆分统计,直接加
GROUP BY子句即可,比如按日期分组统计每天的两类数据量,UNION方案实现这类需求会非常繁琐。
什么时候可以用UNION
仅当多个统计的数据源来自不同的表、或者过滤逻辑完全没有公共的可优化空间时,才考虑用UNION拼接查询。
内容的提问来源于stack exchange,提问作者Runeaway3
相关产品推荐
相关产品推荐

