SQL查询中COUNT(*)统计销售代表管辖账户数量的逻辑疑问
问题解答
核心逻辑拆解
你提供的SQL语句的执行顺序和COUNT(*)的作用逻辑可以按步骤拆解:
- 第一步:执行两表关联
语句中的JOIN会把accounts(账户表)和sales_reps(销售表)通过s.id = a.sales_rep_id的规则关联,生成的临时结果集中每一行对应一个归属到对应销售的账户,所有行都同时包含销售信息和账户信息。 - 第二步:按销售维度分组
GROUP BY s.id, s.name会把临时结果集里同一个销售的所有行都划到同一个分组中,1个分组对应1名销售代表。 - 第三步:分组内统计行数
COUNT(*)的作用是统计每个分组内的总行数,不会过滤任何NULL值。因为每个分组里的每一行都对应一个该销售管辖的账户,所以统计出来的行数就刚好是该销售管辖的账户总数量,语句里给这个统计结果起了别名num_accounts。 - 第四步:分组过滤和排序
HAVING COUNT(*) > 5会过滤掉账户数不超过5的销售分组,最后按账户数量升序排序输出。
补充说明
如果你需要直接得到「符合条件的销售代表总人数」,而不是列出每个符合条件的销售明细,可以用以下语句:
SELECT COUNT(*) qualified_sales_count FROM ( SELECT s.id, s.name FROM accounts a JOIN sales_reps s ON s.id = a.sales_rep_id GROUP BY s.id, s.name HAVING COUNT(*) > 5 ) t;
内容的提问来源于stack exchange,提问作者Ruhan Saini
相关产品推荐
相关产品推荐

