SQL使用GROUP BY分组统计总记录数与条件匹配数结果异常如何修正
问题原因
你当前使用的子查询没有和外层分组的shift字段做关联,统计的是全表中所有event=1的总条数,因此每个分组返回的totalEvents都是全局统计值,无法按班次拆分。
正确解法(推荐:条件聚合)
不需要额外嵌套子查询,直接在聚合函数中加条件判断即可,写法更简洁、执行效率也更高:
SELECT shift, COUNT(*) AS totalShifts, SUM(CASE WHEN event = 1 THEN 1 ELSE 0 END) AS totalEvents FROM `table` GROUP BY shift
原理是聚合时,只对每个分组内event=1的行计数,不符合的行统计为0,求和后就是当前班次的event=1总条数。
如果需要直接返回你示例中拼接好的字符串格式,可以增加字符串拼接逻辑,以MySQL为例:
SELECT CONCAT(shift, ' - ', COUNT(*), ' - ', SUM(CASE WHEN event = 1 THEN 1 ELSE 0 END)) AS result FROM `table` GROUP BY shift
其他可选解法(关联子查询写法,不推荐)
如果你坚持要用子查询实现,需要给表加别名,关联外层的shift字段:
SELECT t.shift, COUNT(t.shift) AS totalShifts, (SELECT COUNT(*) FROM `table` t2 WHERE t2.shift = t.shift AND t2.event = 1) AS totalEvents FROM `table` t GROUP BY t.shift
这种写法需要对子查询做多次扫描,数据量大时性能远低于条件聚合,仅做参考。
内容的提问来源于stack exchange,提问作者Addison Waege
相关产品推荐
相关产品推荐

