Korzystanie z funkcji grupowych

Raportowanie danych zbiorczych za pomocą funkcji grupowych

SQL ma wiele predefiniowanych funkcji agregujących, których można używać do pisania zapytań w celu uzyskania dokładnie tego rodzaju informacji. Klauzula GROUP BY określa, jak grupować wiersze z tabeli danych podczas agregowania informacji, a klauzula HAVING odfiltrowuje wiersze, które nie należą do określone grupy.

Funkcje agregujące wykonują różne czynności, takie jak zliczanie wszystkich wierszy w tabeli, uśrednianie danych w kolumnie i sumowanie danych liczbowych. Agregaty mogą również przeszukiwać tabelę, aby znaleźć najwyższe „MAX” lub najniższe „MIN” wartości w kolumnie. Podobnie jak w przypadku innych typów zapytań, możesz ograniczyć lub odfiltrować wiersze, na które działają te funkcje, za pomocą klauzuli WHERE. Na przykład, jeśli kierownik musi wiedzieć, ilu pracowników pracuje w organizacji, do uzyskania tych informacji można użyć funkcji zbiorczej o nazwie COUNT (*). Funkcja COUNT (*) pokazana w poniższej instrukcji SELECT zlicza wszystkie wiersze w stół.

SELECT COUNT(*)
FROM employees;

  COUNT(*)
----------
        24

Tabela wynikowa funkcji COUNT (*) to pojedyncza kolumna z jednego wiersza, nazywana wynikiem lub wartością skalarną. Zwróć uwagę, że tabela wynikowa ma nagłówek kolumny, który odpowiada nazwie funkcji agregującej określonej w klauzuli SELECT.

Poniżej przedstawiono niektóre z powszechnie używanych funkcji agregujących -

SUM( [ALL | DISTINCT] expression )

AVG( [ALL | DISTINCT] expression )

COUNT( [ALL | DISTINCT] expression )

COUNT(*)

MAX(expression)

MIN(expression)

Słowa kluczowe ALL i DISTINCT są opcjonalne i działają tak samo jak z klauzulami SELECT, których nauczyłeś się pisać. Słowo kluczowe ALL jest ustawieniem domyślnym, gdzie opcja jest dozwolona. Wyrażenie podane w składni może być stałą, funkcją, lub dowolna kombinacja nazw kolumn, stałych i funkcji połączonych operatorami arytmetycznymi, jednak funkcje agregujące są najczęściej używane z nazwą kolumny. Z wyjątkiem funkcji COUNT, wszystkie funkcje agregujące nie uwzględniają wartości NULL.

Istnieją dwie zasady, które należy zrozumieć i przestrzegać podczas korzystania z agregatów:

  • Funkcje agregujące mogą być używane zarówno w klauzuli SELECT, jak i HAVING (klauzula HAVING jest opisana w dalszej części tego rozdziału).

  • Funkcji agregujących nie można używać w klauzuli WHERE. Jego naruszenie spowoduje powstanie funkcji grupowej Oracle ORA-00934, w tym przypadku komunikat o błędzie jest niedozwolony.

Ilustracje

Poniższe zapytanie SELECT zlicza liczbę pracowników w organizacji.

SELECT COUNT(*) Count
FROM employees;

COUNT
-----
   24

Poniższe zapytanie SELECT zwraca średnią pensji pracowników w organizacji.

SELECT AVG(Salary) average_sal
FROM employees;

AVERAGE_SAL
-----------
      15694

Poniższe zapytanie SELECT zwraca sumę wynagrodzeń pracowników w organizacji.

SELECT SUM(Salary) total_sal
FROM employees;

TOTAL_SAL
---------
    87472

Poniższe zapytanie SELECT zwraca najstarsze i najnowsze daty zatrudnienia pracowników w organizacji.

SELECT MIN (hire_date) oldest, MAX (hire_date) latest
FROM employees;

OLDEST		LATEST
---------	-----------
16-JAN-83	01-JUL-2012

GRUPUJ WEDŁUG

Funkcje agregujące są zwykle używane w połączeniu z klauzulą ​​GROUP BY. Klauzula GROUP BY umożliwia korzystanie z funkcji agregujących do odpowiedzi na bardziej złożone pytania dotyczące zarządzania, takie jak:

Jakie jest średnie wynagrodzenie pracowników w każdym dziale?

Ilu pracowników pracuje w każdym dziale?

Ilu pracowników pracuje nad konkretnym projektem?

Funkcja Group by tworzy grupy danych na podstawie kolumn i agreguje informacje tylko w ramach grupy. Kryterium grupowania jest definiowane przez kolumny określone w klauzuli GROUP BY. Zgodnie z tą hierarchią dane są najpierw organizowane w grupy, a następnie klauzula WHERE ogranicza wiersze w każdej grupie.

Zasady korzystania z klauzuli GROUP BY

(1) Wszystkie zależne kolumny lub kolumny używane w funkcji GROUP BY muszą stanowić podstawę grupowania, dlatego muszą być również zawarte w klauzuli GROUP BY.

SELECT	DEPARTMENT_ID, SUM(SALARY)
FROM employees;

DEPARTMENT_ID,
*
ERROR at line 2:
ORA-00937: not a single-group group function

(2) Klauzula GROUP BY nie obsługuje aliasów kolumn, ale rzeczywiste nazwy.

(3) Klauzula GROUP BY może być używana tylko z funkcjami agregującymi, takimi jak SUMA, AVG, COUNT, MAX i MIN.Jeśli jest używana z funkcjami jednorzędowymi, Oracle zgłasza wyjątek jako „ORA-00979: nie wyrażenie GROUP BY” .

(4) Funkcje agregujące nie mogą być używane w klauzuli GROUP BY. Oracle zwróci tutaj komunikat o błędzie „ORA-00934: funkcja grupy niedozwolona”.

Poniższe zapytanie wyświetla liczbę pracowników pracujących w każdym dziale.

SELECT  DEPARTMENT_ID,  COUNT (*)
FROM employees
GROUP BY DEPARTMENT_ID;

Podobnie, poniżej zapytanie, aby znaleźć sumę wynagrodzeń dla odpowiednich identyfikatorów stanowisk w każdym dziale. Uwaga: grupa jest tworzona na podstawie działu i identyfikatora stanowiska. Pojawiają się więc w klauzuli GROUP BY.

SELECT DEPARTMENT_ID, JOB_ID, SUM (SAL)
FROM employees
GROUP BY DEPARTMENT_ID, JOB_ID;

Poniższe zapytanie również daje ten sam wynik. Należy pamiętać, że grupowanie jest oparte na kolumnach identyfikatora działu i identyfikatora zadania, ale nie jest używane do celów wyświetlania.

SELECT SUM (SALARY)
FROM employees
GROUP BY DEPARTMENT_ID, JOB_ID;

Stosowanie słów kluczowych DISTINCT, ALL z funkcjami agregującymi

Określając słowo kluczowe DISTINCT z parametrem wejściowym, funkcja grupowania według funkcji uwzględnia tylko unikalną wartość kolumny do agregacji. Określając słowo kluczowe ALL z parametrem wejściowym, funkcja grupowania według funkcji uwzględnia wszystkie wartości kolumny do agregacji, w tym wartości null i duplikaty. ALL jest specyfikacją domyślną.

Klauzula HAVING

Klauzula HAVING jest używana do funkcji agregujących w taki sam sposób, w jaki klauzula WHERE jest używana do nazw kolumn i wyrażeń. Zasadniczo klauzule HAVING i WHERE robią to samo, czyli filtrują wiersze z uwzględnienia w tabeli wynikowej na podstawie warunku . Chociaż może się wydawać, że klauzula HAVING odfiltrowuje grupy, tak nie jest, a raczej klauzula HAVING filtruje wiersze.

Kiedy wszystkie wiersze z grupy zostaną wyeliminowane, to samo dotyczy grupy. Podsumowując, istotne różnice między klauzulami WHERE i HAVING są następujące:

Klauzula WHERE służy do filtrowania wierszy PRZED akcją GROUPING (tj. Przed obliczeniem funkcji agregujących).

Klauzula HAVING filtruje wiersze PO akcji GROUPING (tj. Po obliczeniu funkcji agregujących).

SELECT JOB_ID,	SUM (SALARY)
FROM employees
GROUP BY JOB_ID
HAVING SUM (SALARY) > 10000;

Klauzula HAVING jest opcją warunkową, która jest bezpośrednio powiązana z opcją klauzuli GROUP BY, ponieważ klauzula HAVING eliminuje wiersze z tabeli wynikowej na podstawie wyniku klauzuli GROUP BY.

SELECT department_id, AVG(Salary)
FROM employees
HAVING AVG(Salary) > 33000;
ERROR at line 1:  ORA-00937: not a single-group group function