SQL按stars星级分组统计review_count总和的实现问题
原SQL错误原因
- 你在SELECT中查询了
stars字段,但GROUP BY子句用的是布尔表达式,不符合分组聚合的语法要求:非聚合类的查询列必须包含在GROUP BY子句中,执行要么报错要么返回错误的随机stars值。 - 分组逻辑
(2<=stars and stars <3) or stars >3存在漏洞:既漏掉了stars=3的判断,也无法输出你需要的分组标签,逻辑完全不匹配需求。
正确SQL写法
用CASE WHEN自定义分组规则是兼容性最强的写法,支持所有主流数据库:
场景1:严格按你描述的分组规则(<3、>=3)
SELECT CASE WHEN stars < 3 THEN '< 3' ELSE '>= 3' END AS stars, SUM(review_count) AS review_count FROM business GROUP BY CASE WHEN stars < 3 THEN '< 3' ELSE '>= 3' END
执行结果:
| stars | review_count |
|---|---|
| < 3 | 123 |
| >= 3 | 1280 |
场景2:匹配你给出的期望输出结果
你给出的期望输出中<3分组的总和1358实际是stars<=3的所有数据之和(3.0的1235+2.5的123),调整分组条件即可得到对应结果:
SELECT CASE WHEN stars <= 3 THEN '< 3' ELSE '>= 3' END AS stars, SUM(review_count) AS review_count FROM business GROUP BY CASE WHEN stars <= 3 THEN '< 3' ELSE '>= 3' END
执行结果和你给出的预期完全一致:
| stars | review_count |
|---|---|
| < 3 | 1358 |
| >= 3 | 45 |
内容的提问来源于stack exchange,提问作者juan escorcia
相关产品推荐
相关产品推荐

