HAVING – filtrowanie pogrupowanych kolumn (GROUP BY) w wyniku zapytania – Kurs SQL

W przypadku, kiedy chciałbyś filtrować wynik zapytania SQL zawierający klauzulę GROUP BY nie możesz zastosować warunku ograniczającego WHERE. Możesz tego dokonać jedynie za pomocą HAVING. Sprawdźmy jak wygląda składnia takiego zapytania oraz przykłady.

select kolumna1, funkcja_grupujaca(kolumna2) from tabela
group by kolumna1
having funkcja_grupujaca(kolumna2) warunek;

Spójrzmy na przykład. Wykorzystamy do niego znaną już nam tabelę wynagrodzenia oraz kod SQL z jednego z poprzednich wpisów:

wynagrodzenia
SELECT id_pracownika, SUM(wynagrodzenie) FROM wynagrodzenia
GROUP BY id_pracownika;

Powyższe zapytanie zwróci nam wynik:

Wykorzystując powyższe zapytanie chcielibyśmy ograniczyć wynik tylko do pracowników, dla których suma wynagrodzenia jest większa niż 5000. W wyniku nie powinniśmy otrzymać pracownika o numerze id_pracownika równym 234 (jego wynagrodzenie to tylko 4054,08). Zastosujmy zatem wspomnianą klauzule HAVING i spójrzmy na gotowe zapytanie SQL:

SELECT id_pracownika, SUM(wynagrodzenie) FROM wynagrodzenia
GROUP BY id_pracownika
HAVING SUM(wynagrodzenie) > 5000;

Wynik powyższego zapytania SQL:

W HAVING możemy filtrować również po innych funkcjach grupujących, które użyłeś w zapytaniu SQL. Ich opis znajdziesz we wpisie który niedługo powstanie ;).

Na początku napisałem, że nie można stosować filtrowania wyniku w przypadku funkcji grupujących bez użycia HAVING. Jest to prawda kiedy stosujemy pojedyncze zapytanie SELECT. Możemy obejść jednak to ograniczenie stosując podzapytanie SELECT. Spójrzmy na poniższy kod SQL:

SELECT * FROM (
SELECT id_pracownika, SUM(wynagrodzenie) as suma FROM wynagrodzenia
GROUP BY id_pracownika) AS t
WHERE t.suma>5000;

W powyższym przykładzie wpierw w podzapytaniu SELECT (t) wyznaczyliśmy sumę wynagrodzenia dla danego pracownika, nadaliśmy jej alias suma, a następnie przekazaliśmy ją do zapytania głównego SELECT. Wynik będzie identyczny jak poprzedniego zapytania, z tą różnicą, że zwracana kolumna będzie opisana jako suma.