聚合函数是否需要groupby?

vshtjzan  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(424)

问题:
给定城市和国家表,查询所有大陆(country.continent)的名称及其各自的平均城市人口(city.population),四舍五入到最接近的整数。
注意:city.countrycode和country.code是匹配的键列。不要把没有城市的大陆包括在你的产出中。
我的解决方案:

SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION)) FROM COUNTRY INNER JOIN CITY ON COUNTRY.CODE=CITY.COUNTRYCODE

但在我添加一个按语句分组的更新解决方案之前,这似乎不起作用:

SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION)) FROM COUNTRY INNER JOIN CITY ON COUNTRY.CODE=CITY.COUNTRYCODE GROUP BY COUNTRY.CONTINENT

为什么会这样?为什么不显示新的内部联接表的平均填充值?我知道这会给我一个错误的答案,也就是说,它将显示每个大陆相同的平均人口值。但我的疑问是,当我不添加groupby语句时,为什么它不起作用。
引发的错误:
第1行出现错误1140(42000):在不带group by的聚合查询中,select列表的表达式#1包含未聚合的列“run 5 y53padyvlle.country.continent”;这与sql\u mode=only\u full\u group by不兼容

qkf9rpyu

qkf9rpyu1#

问题不是关键 AVG() . 你可以做:

SELECT FLOOR(AVG(ci.POPULATION))
FROM COUNTRY c INNER JOIN
     CITY ci
     ON c.CODE = ci.COUNTRYCODE;

这将返回一行,即数据库中所有城市的总体平均人口。
问题是当你这样做的时候:

SELECT c.CONTINENT, FLOOR(AVG(ci.POPULATION)) 
. . .

这个 CONTINENT 部分未汇总。sql引擎需要知道如何处理它。把钥匙放进 GROUP BY :

GROUP BY c.CONTINENT

表示要在结果集中为中的每个值指定一行 CONTINENT .

相关问题