Grupowania

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.

Przykład

Policzyć, ilu jest klientów indywidualnych, a ile podmiotów gospodarczych.

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.

Przykład

Obliczyć, ile zamówień składał każdy z klientów w każdym roku. Wynik uporządkować rosnąco według roku i według numeru klienta.

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.

Przykład

Obliczyć, ile zamówień składał każdy z klientów w każdym roku. Wynik uporządkować rosnąco według roku i według numeru klienta. Nie uwzględniać zamówień jeszcze nie zrealizowanych.

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.

Przykład

Wypisać numery klientów i ilość złożonych przez nich zamówień pod warunkiem, że pierwsze zamówienie złożyli dopiero po roku 1998.

SELECT zam_klt_id, count(*)
  FROM zamowienia
 GROUP BY zam_klt_id
HAVING min(zam_data_zamowienia)>to_date('19981231', 'yyyymmdd');