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:
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.