SQL统计异常求助:按分类统计警情总数及逮捕数结果不符
问题排查与修正方案
嘿,我一眼就瞅出你SQL里的问题啦!你的Arrested列始终返回9014,是因为子查询没有和主查询的category做关联——这个子查询会直接统计整个数据集里所有带ARREST的事件总数,完全不管主查询当前分组的是哪个分类,所以每个分类的Arrested都显示同一个全局总数。
两种修正方法
方法1:条件聚合(推荐,更简洁高效)
不用子查询,直接用CASE语句配合COUNT实现按分类统计逮捕事件数:
SELECT category, COUNT(Resolution) AS Total_Incidents, COUNT(CASE WHEN Resolution LIKE '%ARREST%' THEN 1 END) AS Arrested FROM tutorial.sf_crime_incidents_2014_01 GROUP BY category ORDER BY Total_Incidents DESC;
原理:当Resolution包含ARREST时,CASE返回1,否则返回NULL;而COUNT会自动忽略NULL值,这样就精准统计了每个分类下的逮捕事件数。
方法2:关联子查询(如果偏好子查询写法)
给主表和子表起别名,让子查询只统计当前分类下的逮捕事件:
SELECT category, COUNT(Resolution) AS Total_Incidents, (SELECT COUNT(resolution) FROM tutorial.sf_crime_incidents_2014_01 sub WHERE sub.category = main.category AND sub.Resolution LIKE '%ARREST%') AS Arrested FROM tutorial.sf_crime_incidents_2014_01 main GROUP BY category ORDER BY Total_Incidents DESC;
原理:通过sub.category = main.category把主查询的当前分类和子查询关联起来,子查询只会返回和当前分类匹配的逮捕事件数。
内容的提问来源于stack exchange,提问作者Kbbm
相关产品推荐
相关产品推荐

