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.

 

 

This entry was posted in Oracle, Oracle SQL, Oracle SQL Podstawy, SQL. Bookmark the permalink.

6 Responses to Kurs Oracle SQL online. Grupowanie, czyli klauzula GROUP BY

  1. ktostam says:

    A skąd to extract nagle? Nie było tego wcześniej w kursie.

  2. Ania says:

    Witam,
    czy czymś różni się zapytanie:
    SELECT COUNT(job_id) ilu_klientów
    from EMPLOYEES
    group by job_id
    having count(job_id)>5

  3. Ania says:

    …od przykładu 5?

    • Celestyn says:

      Różni się tylko tym, że jak damy wpiszemy count(*), to zlicza całą kolumnę, również jeśli były by w niej puste rekordy, natomiast jak określimy daną kolumnę to wówczas zliczy tylko “zapisane” rekordy (bez wartości “NULL”).

Leave a Reply

Your email address will not be published.