问题:
给定CITY和COUNTRY表,查询所有表的名称 大陆(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
但是在添加GROUP BY语句之前,这似乎不起作用 更新的解决方案:
SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION)) FROM COUNTRY INNER JOIN CITY ON COUNTRY.CODE=CITY.COUNTRYCODE GROUP BY COUNTRY.CONTINENT
为什么会这样?为什么不显示新INNER JOIN表的平均人口值? 我知道这会给我一个错误的答案,即它将显示每个大陆相同的平均人口价值。但我怀疑的是,当我不添加GROUP BY语句时它为什么不起作用。
抛出的错误:
第1行的错误1140(42000):在没有GROUP BY的聚合查询中, SELECT列表的表达式#1包含非聚合列 'run_y53padyvlle.COUNTRY.continent';这是不相容的 的sql_mode = only_full_group_by
答案 0 :(得分:1)
问题不在于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
中的每个值。