
Strona o szybkim czytaniu.
Grupowanie polega na podzieleniu zbioru wierszy na grupy, które mają pewną wspólną cechę. Grupowania dokonuje się w celu zastosowania funkcji agregujących nie w stosunku do całego zbioru wierszy, ale do poszczególnych grup wierszy.
W celu zgrupowania rekordów należy dodać nową klauzulę GROUP BY
wraz z wyspecyfikowaniem kolumny lub wyrażenia, według którego mają być pogrupowane wiersze.
SELECT klt_typ, count(*)
FROM klienci
GROUP BY klt_typ;
Na liście klauzuli SELECT mogą się znaleźć tylko kolumny i wyrażenia, według których zapytanie jest grupowane, oraz wywołania funkcji agregujących.
Grupowanie może zostać wykonane według kilku kolumn.
SELECT to_char(zam_data_zamowienia, 'yyyy'),
zam_klt_id,
count(*)
FROM zamowienia
GROUP BY to_char(zam_data_zamowienia, 'yyyy'), zam_klt_id
ORDER BY to_char(zam_data_zamowienia, 'yyyy'), zam_klt_id;
Przed dokonaniem grupowania można zastosować klauzulę WHERE
, która wybierze tylko część wierszy z tabeli.
SELECT to_char(zam_data_zamowienia, 'yyyy'),
zam_klt_id,
count(*)
FROM zamowienia
WHERE zam_data_realizacji IS NOT NULL
GROUP BY to_char(zam_data_zamowienia, 'yyyy'), zam_klt_id
ORDER BY to_char(zam_data_zamowienia, 'yyyy'), zam_klt_id;
Klauzula WHERE
wykonuje się przed grupowaniem, a zatem nie można w tej klauzuli sprecyzować warunku zawierającego funkcje grupowe.
Aby taki warunek zawrzeć w zapytaniu należy zastosować dodatkową klauzulę HAVING
wraz z odpowiednim warunkiem. Jest ona odpowiednikiem klauzuli WHERE
, tylko, że wykonuje się ona po procesie grupowania.
SELECT zam_klt_id, count(*)
FROM zamowienia
GROUP BY zam_klt_id
HAVING min(zam_data_zamowienia)>to_date('19981231', 'yyyymmdd');