Grupowanie danych: Klauzula GROUP BY, GROUPING SETS, OVER cz. II
GROUP BY
Aby zrozumieć mniej więcej jak funkcjonuje klauzula GROUP BY
wykonajmy poniższe zapytanie:
SELECT * FROM klienci GROUP BY miasto;
W efekcie uzyskamy taki rezultat:
ID | Imie | Nazwisko | Miasto |
7 | Ewa | Pogodna | Bydgoszcz |
5 | Monika | Kopacz | Gdańsk |
4 | Radosław | Sikorski | Kraków |
6 | Piotr | Grabiec | Toruń |
8 | Sebastian | Szybki | Warszawa |
Jak widać nasze dane zostały pogrupowane według miasta pochodzenia danego klienta. Załóżmy, że chcemy dowiedzieć się ilu mamy klientów z danego miasta, do tego celu wykorzystamy funkcję COUNT()
omówioną w poprzednim wpisie oraz grupowanie:
SELECT miasto, COUNT(miasto) FROM klienci GROUP BY miasto;
Efekt naszego zapytania:
Miasto | COUNT(Miasto) |
Bydgoszcz | 1 |
Gdańsk | 1 |
Kraków | 3 |
Toruń | 1 |
Warszawa | 2 |
Funkcja grupująca COUNT()
został tutaj wywołana dla danej grupy, utworzonej za pośrednictwem klauzuli GROUP BY
.
Oczywiście grupowanie można użyć również w nieco bardziej rozbudowanych zapytaniach, na przykład:
SELECT klienci.ID, klienci.Imie, zlecenia.ID, zlecenia.Miasto FROM klienci JOIN zlecenia GROUP BY zlecenia.Miasto, zlecenia.ID;
lub:
SELECT klienci.ID, klienci.Imie, zlecenia.ID, zlecenia.Miasto FROM klienci JOIN zlecenia WHERE zlecenia.Miasto != 'Kraków' GROUP BY zlecenia.Miasto, zlecenia.ID;
Należy jednak pamiętać, że funkcje grupujące nie mogą być wywoływanie w klauzuli WHERE
ponieważ dane wtedy nie są jeszcze pogrupowane.
Niedopuszczalny jest więc taki zapis:
SELECT klienci.ID, klienci.Imie, zlecenia.ID, zlecenia.Miasto FROM klienci JOIN zlecenia WHERE COUNT(zlecenia.Miasto) > 1 -- BŁĄD! GROUP BY zlecenia.Miasto, zlecenia.ID;