Powód, dla którego kolumna jest nieprawidłowa na liście select, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY [duplikat]

Możliwy duplikat:
grupowanie przez / zagregowanie funkcji w SQL

Mam błąd -

Kolumna " Pracownik.EmpID ' jest nieprawidłowy na liście select, ponieważ jest nie zawiera ani funkcji zbiorczej, ani klauzuli 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 

Ta sytuacja pasuje do odpowiedzi zadanej przez Billa Karwina.

Korekta dla powyższego, pasuje do odpowiedzi przez 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 

ORYGINALNE PYTANIE -

Dla zapytania SQL -

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)

Nie rozumiem, dlaczego dostaję ten błąd. Wszystko, co chcę zrobić, to dołączyć do stołów, a następnie zgrupować wszystkich pracowników w danej lokalizacji razem.

Myślę, że mam częściowe Wyjaśnienie dla mojego pytania. Tell me if its ok -

Aby zgrupować wszystkich pracowników, którzy pracują w tym samym miejscu musimy najpierw wspomnieć LocationID.

Wtedy nie możemy/nie wymień każdy identyfikator pracownika obok niego. Raczej wymieniamy całkowitą liczbę pracowników w tej lokalizacji, czyli powinniśmy sumować() pracowników pracujących w tej lokalizacji. Dlaczego robimy to w ten drugi sposób, nie jestem pewien. Wyjaśnia to więc część błędu "nie jest zawarta w żadnej funkcji zbiorczej".

Jakie jest wyjaśnienie dla GROUP BY klauzula część błędu ?

Author: dreftymac, 2012-12-22

4 answers

Załóżmy, że mam następującą tabelę T:

a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr

I wykonuję następujące zapytanie:

SELECT a, b
FROM T
GROUP BY a

Wyjście powinno mieć dwa wiersze, jeden wiersz gdzie a=1 i drugi wiersz gdzie a=2.

Ale jaka powinna być wartość b na każdym z tych dwóch wierszy? Istnieją trzy możliwości w każdym przypadku i nic w zapytaniu nie wyjaśnia, którą wartość wybrać dla b w każdej grupie. To dwuznaczne.

Pokazuje to regułę jednowartościową, która zakazuje niezdefiniowanych wyników uzyskiwanych podczas uruchamiania grupy przez zapytanie i dołącza do listy select kolumny, które nie są częścią kryteriów grupowania, ani nie pojawiają się w funkcjach agregowanych (suma, MIN, MAX, itp.).

Naprawa może wyglądać tak:

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

Teraz jest jasne, że chcesz następujący wynik:

a   x
--------
1   ghi
2   pqr
 440
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 13:32:46

Twoje zapytanie będzie działać w MYSQL, Jeśli ustawisz opcję disable ONLY_FULL_GROUP_BY server mode (i domyślnie jest to ). Ale w tym przypadku używasz różnych RDBMS. Aby Twoje zapytanie zadziałało, dodaj wszystkie niezagregowane kolumny do klauzuli GROUP BY, NP

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

Kolumny Niezagregowane oznacza, że kolumna nie jest przekazywana do funkcji zagregowanych, takich jak SUM, MAX, COUNT, itd..

 48
Author: John Woo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 03:59:42

"wszystko, co chcę zrobić, to dołączyć do stołów, a następnie zgrupować wszystkich pracowników w określonym miejscu razem."

Wygląda na to, że chcesz, aby wynik instrukcji SQL zawierał listę wszystkich pracowników w firmie, ale najpierw wszyscy ludzie w biurze Anaheim, potem ludzie w biurze Buffalo, a następnie ludzie w biurze Cleveland (A, B, C, zrozum, oczywiście nie wiem, jakie masz lokalizacje).

W takim przypadku, stracić grupę przez oświadczenie. Wszystko czego potrzebujesz to ORDER BY loc.LocationID

 13
Author: ExactaBox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 03:55:58

Zasadniczo, ten błąd mówi, że jeśli zamierzasz użyć klauzuli GROUP BY, to twój wynik będzie relacją / tabelą z wierszem dla każdej grupy, więc w instrukcji SELECT możesz tylko "wybrać" kolumnę, według której grupujesz i używać funkcji agregujących w tej kolumnie, ponieważ inne kolumny nie pojawią się w wynikowej tabeli.

 8
Author: Alex W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 03:54:50