Причина недопустимости столбца в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY [дубликат]


Возможные Дубликаты:
группировка по / агрегатная функция путаница в SQL

я получил ошибку -

Столбец '.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 

эта ситуация вписывается в ответ Билл Karwin.

коррекция выше, вписывается в ответ 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.

тогда мы не можем / не упоминаем каждый идентификатор сотрудника рядом с ним. Скорее, мы упоминаем общее количество сотрудников в этом месте, т. е. мы должны суммировать() сотрудников, работающих в этом месте. Почему мы делаем это последним способом, я не уверен. Таким образом, это объясняет часть ошибки "она не содержится ни в одной агрегатной функции".

каково объяснение GROUP BY предложение часть ошибки ?

4 206

4 ответа:

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

этот демонстрирует один-значение, который запрещает неопределенные результаты, которые вы получаете при запуске группы по запросу, и вы включаете любые столбцы в список выбора, которые не являются частью критериев группировки и не отображаются в агрегатных функциях (SUM, MIN, MAX и т. д.).

исправление может выглядеть так:

SELECT a, MAX(b) AS x
FROM T
GROUP BY a

теперь ясно, что вы хотите получить следующий результат:

a   x
--------
1   ghi
2   pqr

ваш запрос будет работать в MYSQL Если вы хотите отключить ONLY_FULL_GROUP_BY режим сервера (и по умолчанию это). Но в этом случае вы используете разные СУБД. Поэтому, чтобы ваш запрос работал,добавить все неагрегированных столбцов на GROUP BY предложения, например

SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2

Неагрегированные столбцы означает, что столбец не передается в агрегированные функции, такие как SUM,MAX,COUNT и т. д..

"все, что я хочу сделать, это присоединиться к таблиц, а затем группа сотрудников в определенном месте вместе."

похоже, что вы хотите, чтобы вывод инструкции SQL перечислял каждого сотрудника в компании, но сначала всех людей в офисе в Анахайме, затем людей в офисе в Буффало, а затем людей в офисе в Кливленде (A, B, C, get it, очевидно, я не знаю, какие места у вас есть).

в этом случае, потерять Группировка по заявлению. Все, что вам нужно-это ORDER BY loc.LocationID

в основном, эта ошибка говорит о том, что если вы собираетесь использовать GROUP BY предложение, то ваш результат будет отношение / таблица со строкой для каждой группы, так что в вашем вы можете только "выбрать" столбец, по которому вы группируете, и использовать агрегатные функции для этого столбца, потому что другие столбцы не будут отображаться в результирующей таблице.