Нужна ли GROUP BY для функции агрегирования?

0

Вопрос:

С учетом таблиц 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
    Это поведение объяснено в документации MySQL также dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
  • 0
    это потому что это несовместимо с sql_mode = only_full_group_by
Теги:
group-by
aggregation

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню