如何不使用GROUP BY实现该SQL大洲平均人口统计查询的相同结果?
不用GROUP BY实现大洲城市人口平均取整的查询
嘿,我懂你想绕开GROUP BY用子查询实现需求的思路,咱们来一步步修正你的写法~
你之前的子查询关联的是CO.CODE,这会导致你得到的是每个国家的城市人口平均,而不是整个大洲的。要拿到大洲级别的平均值,得把关联条件改成基于大洲的匹配才行。
这里有两种可行的子查询写法:
方法1:关联大洲的子查询(带DISTINCT去重)
因为COUNTRY表中同一个大洲会对应多个国家,直接查询会重复输出同一个大洲的结果,所以需要用DISTINCT去重:
SELECT DISTINCT CO.CONTINENT, (SELECT FLOOR(AVG(CI.POPULATION)) FROM CITY CI JOIN COUNTRY CO2 ON CI.COUNTRYCODE = CO2.CODE WHERE CO2.CONTINENT = CO.CONTINENT) AS AVG_CITY_POPULATION FROM COUNTRY CO;
这个逻辑是:对于COUNTRY表中的每个大洲(去重后),子查询会找到所有属于该大洲的城市,计算它们的人口平均值并取整。
方法2:嵌套子查询匹配大洲
如果你不想用JOIN,也可以在子查询里先筛选出当前大洲的所有国家代码,再匹配对应的城市:
SELECT DISTINCT CO.CONTINENT, (SELECT FLOOR(AVG(CI.POPULATION)) FROM CITY CI WHERE CI.COUNTRYCODE IN (SELECT CODE FROM COUNTRY WHERE CONTINENT = CO.CONTINENT)) AS AVG_CITY_POPULATION FROM COUNTRY CO;
这里的内层子查询先定位到当前大洲下的所有国家,再筛选出这些国家的城市数据计算平均取整。
结果验证
这两种写法都能和你原来的GROUP BY查询得到完全一致的结果,你可以对比执行结果确认逻辑正确性:
原查询参考:
SELECT CO.CONTINENT, FLOOR(AVG(CI.POPULATION)) FROM CITY CI INNER JOIN COUNTRY CO ON CI.COUNTRYCODE = CO.CODE GROUP BY CO.CONTINENT;
内容的提问来源于stack exchange,提问作者Vishal_Kotecha
相关产品推荐
相关产品推荐

