MySQL单查询双统计:每年事故总数与车祸数统计异常排查
解决MySQL按年统计事故总数与车祸数量的问题
嘿,我一眼就看出你当前查询的问题啦!你写的语句里犯了两个关键错误:
- 首先,
WHERE Car = 1直接过滤掉了所有非车祸的事故,那自然没法统计所有事故总数了; - 其次,
GROUP BY Year, Car会把年份和是否为车祸分成不同的组,再加上两个Count(*)都是统计当前组的行数,结果自然Total和Car的值完全一样,根本达不到你要的效果。
正确的查询写法
咱们用条件聚合就能搞定这个需求,不需要过滤掉非车祸数据,而是在聚合函数里判断是否为车祸:
SELECT Year, COUNT(*) AS Accidents, -- 统计每年所有事故总数 COUNT(CASE WHEN Car = 1 THEN 1 END) AS Car -- 仅统计Car=1的车祸数量 FROM ACCIDENTS GROUP BY Year ORDER BY Year ASC;
为什么这么写?
COUNT(*)会统计当前分组(每年)里的所有行数,也就是该年份的事故总数;COUNT(CASE WHEN Car = 1 THEN 1 END)的逻辑是:当Car=1时返回1,否则返回NULL,而COUNT函数会自动忽略NULL值,所以最终只会统计符合车祸条件的行数。
示例输出
执行这个查询后,你就能得到和期望一致的结果:
| Year | Accidents | Car |
|---|---|---|
| 1990 | 500 | 25 |
| 1991 | 521 | 18 |
内容的提问来源于stack exchange,提问作者Shiro Pie
相关产品推荐
相关产品推荐

