Причина для столбца недействительна в списке выбора, поскольку она не содержится ни в агрегатной функции, ни в предложении 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 вы будете может только "выбрать" столбец, который вы группируете, и использовать агрегатные функции в этом столбце, потому что другие столбцы не будут отображаться в результирующей таблице.