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 ?
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
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..
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
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.
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