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;