Причина для столбца недействительна в списке выбора, поскольку она не содержится ни в агрегатной функции, ни в предложении GROUP BY
Возможный дубликат:
Путаница GROUP BY/агрегатная функция в SQL
У меня есть ошибка -
Столбец "Employee.EmpID" недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
Эта ситуация вписывается в ответ, данный Биллом Карвином.
коррекция выше, вписывается в ответ ExactaBox -
select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
ОРИГИНАЛЬНЫЙ ВОПРОС -
Для SQL-запроса -
select *
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by (loc.LocationID)
Я не понимаю, почему я получаю эту ошибку. Все, что я хочу сделать, это присоединиться к таблицам, а затем объединить всех сотрудников в определенном месте.
Я думаю, что у меня есть частичное объяснение для моего собственного вопроса. Скажите мне, нормально ли это -
Чтобы сгруппировать всех сотрудников, работающих в одном месте, мы должны сначала упомянуть LocationID.
Тогда мы не можем/не указывать каждый идентификатор сотрудника рядом с ним. Скорее, мы упомянем общее количество сотрудников в этом месте, то есть мы должны SUM() сотрудников, работающих в этом месте. Почему мы делаем это последним способом, я не уверен.
Таким образом, это объясняет часть ошибки "не содержится в агрегатной функции".
Каково объяснение части "GROUP BY" части ошибки?
Ответы
Ответ 1
Предположим, что у меня есть следующая таблица T
:
a b
--------
1 abc
1 def
1 ghi
2 jkl
2 mno
2 pqr
И я делаю следующий запрос:
SELECT a, b
FROM T
GROUP BY a
Выход должен иметь две строки, одну строку, где a = 1 и вторую строку, где a = 2.
Но что должно значить значение b в каждой из этих двух строк? В каждом случае есть три возможности, и ничто в запросе не дает понять, какое значение выбрать для b в каждой группе. Это двусмысленно.
Это демонстрирует правило единственного значения, которое запрещает результаты undefined, которые вы получаете при запуске запроса GROUP BY, и включаете любые столбцы в списке выбора, которые не являются ни частью критериев группировки, ни появляются в совокупные функции (SUM, MIN, MAX и т.д.).
Фиксация может выглядеть так:
SELECT a, MAX(b) AS x
FROM T
GROUP BY a
Теперь ясно, что вы хотите получить следующий результат:
a x
--------
1 ghi
2 pqr
Ответ 2
Ваш запрос будет работать в MYSQL
, если вы отключите ONLY_FULL_GROUP_BY
режим сервера (и по умолчанию он есть). Но в этом случае вы используете разные РСУБД. Чтобы заставить ваш запрос работать, добавить все неагрегированные столбцы в ваше предложение GROUP BY
, например
SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2
Неагрегированные столбцы означают, что столбец не переходит в агрегированные функции, такие как SUM
, MAX
, COUNT
и т.д.
Ответ 3
"Все, что я хочу сделать, это присоединиться к таблицам, а затем сгруппировать всех сотрудников в определенном месте вместе."
Похоже, что вы хотите, чтобы вывод инструкции SQL отображал список всех сотрудников компании, но сначала все люди в офисе Анахайма, затем люди в офисе Буффало, затем люди в офисе в Кливленде (A, B, C, получите его, очевидно, я не знаю, какие у вас есть).
В этом случае потеряйте оператор GROUP BY. Все, что вам нужно, это ORDER BY loc.LocationID
Ответ 4
В основном, эта ошибка говорит о том, что если вы собираетесь использовать предложение GROUP BY
, тогда ваш результат будет отношением/таблицей со строкой для каждой группы, поэтому в вашем заявлении SELECT
вы будете может только "выбрать" столбец, который вы группируете, и использовать агрегатные функции в этом столбце, потому что другие столбцы не будут отображаться в результирующей таблице.