You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:12:01