Kurs Oracle SQL online. Grupowanie, czyli klauzula GROUP BY

Witajcie 🙂

W tej lekcji kursu Oracle SQL zajmiemy się grupowaniami – czyli jak zrobić, żeby nasze funkcje agregujące działały w ramach pewnej grupy rekordów.

Jak działały funkcje agregujące w poprzednich lekcjach?

Jeśli w zapytaniu nie było grupowania oraz:

  • nie było warunku WHERE – grupą była cała tabela. Funkcja działała w ramach wszystkich rekordów w tabeli
  • był warunek w WHERE – funkcja działała w ramach rekordów ograniczonych tym warunkiem

Teraz do tworzonych przez nas zapytań dodamy GROUP BY – rekordy (które zostały po ewentualnym filtrowaniu w WHERE) zostaną podzielone na grupy i w ramach nich zadziała funkcja agregująca. Innymi słowy – grupowanie to łączenie rekordów w oparciu o wspólną cechę.

Kurs Oracle SQL Online - grupowanie

Przykład1. Wyświetl ilu jest pracowników w ramach poszczególnych job_id

SELECT job_id, Count(*) ilu_klientów
 FROM employees
 GROUP BY job_id;

Przykład 2. Spróbuj dodać kolumnę last_name.

SELECT job_id, Count(*) ilu_klientów, last_name 
FROM employees 
GROUP BY job_id;

ORA-00979: not a GROUP BY expression

W przypadku grupowania – po SELECT mogą stać tylko kolumny, które znajdują się po GROUP lub jest są użyte w funkcji agregującej.

Przykład 3. Wyświetl ilu jest pracowników w ramach poszczególnych job_id dla pracowników zatrudnionych po 2005 roku.

SELECT job_id, Count(*) ilu_klientów 
FROM employees 
WHERE EXTRACT(YEAR FROM hire_date)>2005  
GROUP BY job_id;

Pytanie za 100 punktów 🙂 Czy w WHERE można używać funkcji agregujących? (Wybiegając w przyszłość dodam, że bez podzapytań 🙂 )

 Przykład 4. Wyświetl ilu jest pracowników w ramach poszczególnych job_id. Wyświetl tylko te job_id, gdzie jest więcej niż 5 pracowników.

SELECT job_id, Count(*) ilu_klientów
FROM employees
WHERE Count(*) >5
GROUP BY job_id;

ORA-00934: group function is not allowed here

Nie można 🙂 Nie można w WHERE używać funkcji agregujących.

WHERE służy do limitowania rekordów, które zostaną poddane grupowaniu. Do limitowania grup służy HAVING. W HAVING można używać funkcji agregujących.

 Przykład 5. Wyświetl ilu jest pracowników w ramach poszczególnych job_id. Wyświetl tylko te job_id, gdzie jest więcej niż 5 pracowników.

 SELECT job_id, Count(*) ilu_klientów
 FROM employees
 GROUP BY job_id
 HAVING Count(*)>5;

Co w następnej lekcji?

Złączenia – czyli jak wybrać dane znajdujące się w różnych tabelach.

 

 

About Rafal Stryjek

My LinkedIn profile. Passionate about data. Data Warehousing Expert. Snowflake Data SuperHero & Oracle ACE Associate. International conferences Speaker: Snowflake Build Summit-BUILD.local 2021, Oracle Open World, DOAG, UKOUG, APEX World,.. Visit dataconsulting.pl website!
This entry was posted in Oracle, Oracle SQL, Oracle SQL Podstawy, SQL. Bookmark the permalink.

Leave a Reply