MySQL如何基于不同WHERE条件实现SELECT多列聚合统计
实现方法
要在同一条分组查询里输出不同筛选条件的独立统计列,用条件聚合即可,不需要拆分多条查询。
你原来的写法把org_role = 9写在了全局WHERE里,这个条件会过滤掉所有org_role不等于9的记录,自然没法统计org_role=7的数值,只需要把差异化的统计条件放到聚合函数内部,公共筛选条件留在WHERE中即可。
修改后的可直接运行的语句如下:
SELECT org_id, COUNT(CASE WHEN org_role = 9 THEN 1 END) AS total, COUNT(CASE WHEN org_role = 7 THEN 1 END) AS total2 FROM organization WHERE org_id = 10 GROUP BY org_id;
逻辑说明
- 全局
WHERE只保留公共过滤规则org_id = 10,先把对应机构的所有角色记录捞出来,避免多余的数据扫描 - 聚合函数内用
CASE做分支判断:符合对应统计规则时返回非空值,不符合时返回NULL,COUNT函数会自动跳过NULL值,最终得到的计数就是对应条件下的记录总数 - 如果你使用的是MySQL,还可以用更简洁的简写写法,执行效果完全一致:
SELECT org_id, SUM(org_role = 9) AS total, SUM(org_role = 7) AS total2 FROM organization WHERE org_id = 10 GROUP BY org_id;
这个写法利用了MySQL中布尔判断成立返回1、不成立返回0的特性,直接求和就能得到对应条件的记录数。
避坑提醒:不要在全局WHERE中同时写
org_role = 9和org_role = 7的条件,两个条件互斥会导致查询返回空结果,所有和具体统计列绑定的筛选规则都要放在聚合函数内部。
内容的提问来源于stack exchange,提问作者sean
相关产品推荐
相关产品推荐

