Нужна ли GROUP BY для функции агрегирования? - PullRequest
0 голосов
/ 29 мая 2018

Вопрос:

Учитывая таблицы 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.

Выдается ошибка:

ОШИБКА 1140 (42000) в строке 1: в агрегированном видезапрос без GROUP BY, выражение № 1 списка SELECT содержит неагрегированный столбец 'run_y53padyvlle.COUNTRY.continent';это несовместимо с sql_mode = only_full_group_by

1 Ответ

0 голосов
/ 29 мая 2018

Проблема не в 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.

...