Вопрос:
С учетом таблиц 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
Проблема не в 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
.