如何使用COUNT函数统计多条件数据?SQL语句修正求助
修正后的SQL语句及说明
你的原SQL存在两个核心问题:
- 用CASE包裹聚合函数
COUNT(*),导致整个查询只能返回单一聚合值,无法拆分出三个类别的统计结果; - CASE分支未覆盖Medium类别的判断逻辑,且列名定义错误。
正确的SQL实现(条件聚合)
使用条件聚合可分别统计每个类别下的城市数量,具体语句如下:
SELECT COUNT(CASE WHEN Population < 1000000 AND Area < 500 THEN 1 END) AS Small, COUNT(CASE WHEN Population > 1000000 AND Population < 2000000 AND Area > 500 AND Area < 700 THEN 1 END) AS Medium, COUNT(CASE WHEN Population > 2000000 AND Area > 700 THEN 1 END) AS Big FROM city;
也可以用SUM实现(逻辑等价):
SELECT SUM(CASE WHEN Population < 1000000 AND Area < 500 THEN 1 ELSE 0 END) AS Small, SUM(CASE WHEN Population BETWEEN 1000001 AND 1999999 AND Area BETWEEN 501 AND 699 THEN 1 ELSE 0 END) AS Medium, SUM(CASE WHEN Population > 2000000 AND Area > 700 THEN 1 ELSE 0 END) AS Big FROM city;
逻辑说明
- 对每一行数据,CASE语句判断是否符合对应类别条件:符合则返回
1(COUNT统计非NULL值,SUM累加数值),不符合则返回NULL(COUNT忽略,SUM加0); - 三个独立的聚合函数分别计算Small、Medium、Big三类的城市数量,最终返回一行三列的结果,与预期输出一致。
数据验证
基于你提供的city表:
| City | Population | Area |
|---|---|---|
| A | 2500000 | 800 |
| B | 990000 | 400 |
| C | 1200000 | 600 |
执行上述SQL后会得到预期结果:
| Small | Medium | Big |
|---|---|---|
| 1 | 1 | 1 |
内容的提问来源于stack exchange,提问作者Harper
相关产品推荐
相关产品推荐

