Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

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:

IDImieNazwiskoMiasto
7EwaPogodnaBydgoszcz
5MonikaKopaczGdańsk
4RadosławSikorskiKraków
6PiotrGrabiecToruń
8SebastianSzybkiWarszawa

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:

MiastoCOUNT(Miasto)
Bydgoszcz1
Gdańsk1
Kraków3
Toruń1
Warszawa2

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;

Strony: 1 2 3 4

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , ,

Dodaj komentarz

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest