MySQL查询需求:统计各部门所有状态数量,无记录返回0
解决MySQL统计所有部门-状态组合(含0值)的问题
这问题我之前处理过,你当前的查询只返回有实际记录的部门-状态组合,要得到包含0的完整结果,核心是先构建所有部门和所有状态的全量组合,再和你的业务数据关联统计。
问题原因
你的原语句直接从result表分组聚合,只有存在对应记录的Dept+Status组合才会被输出,像部门c没有Pos状态的记录,自然就不会出现在结果里。
解决方案:生成全量组合后左连接统计
我们可以先提取所有唯一的部门和所有唯一的状态,通过交叉连接(CROSS JOIN)生成所有可能的组合,再左连接到原表统计数量:
SELECT d.Dept, s.Status, COUNT(r.Status) AS Count FROM -- 获取所有唯一部门 (SELECT DISTINCT Dept FROM result) d -- 交叉连接所有唯一状态,生成全量部门-状态组合 CROSS JOIN (SELECT DISTINCT Status FROM result) s -- 左连接原表,保留所有全量组合 LEFT JOIN result r ON d.Dept = r.Dept AND s.Status = r.Status -- 按部门和状态分组统计 GROUP BY d.Dept, s.Status ORDER BY s.Status DESC, d.Dept;
效果说明
CROSS JOIN会生成所有部门和状态的笛卡尔积,比如你的场景里就是a/b/c三个部门 ×Neg/Pos两个状态,得到6个组合。LEFT JOIN确保即使原表中没有对应记录(比如部门c的Pos),这个组合也会被保留,此时r.Status为NULL。COUNT(r.Status)会自动忽略NULL值,所以没有记录的组合会返回0,正好符合你的预期结果。
执行这个语句后,就能得到你想要的包含c | Pos | 0的完整统计结果了。
内容的提问来源于stack exchange,提问作者user6537067
相关产品推荐
相关产品推荐

