Wprowadzenie do Group By i Having

WPROWADZENIE DO GROUP BY I HAVING

GROUP BY i HAVING to narzędzia służące do grupowania danych i wykonywania obliczeń na całych grupach, a nie na pojedynczych rekordach.

Można je porównać do:

GROUP BY → „Podziel dane na grupy według jakiegoś kryterium”

FUNKCJE AGREGUJĄCE (SUM, AVG, MAX…) → „Wykonaj obliczenia dla każdej grupy”

HAVING → „Od filtruj grupy po wykonaniu obliczeń”

PRZYKŁADOWA BAZA – tabela sprzedaży

Załóżmy, że mamy tabelę:

CREATE TABLE sprzedaż (
id INT,
sprzedawca VARCHAR(20),
produkt VARCHAR(20),
ilosc INT,
cena DECIMAL(10,2)
);

Przykładowe dane:

idsprzedawcaproduktilosccena
1AnnaKwiaty510.00
2AnnaNawozy325.00
3JanKwiaty210.00
4JanZiemia140.00
5MarekKwiaty1010.00

Co robi GROUP BY?

GROUP BY tworzy grupy rekordów, które mają tę samą wartość w podanej kolumnie.

Np. jeśli zgrupujemy po sprzedawca, baza zrobi takie koszyki:

✔ Grupa 1 – Anna

→ rekordy 1 i 2

✔ Grupa 2 – Jan

→ rekordy 3 i 4

✔ Grupa 3 – Marek

→ rekord 5

Przykład 1: Obliczenie sumy sprzedaży każdego sprzedawcy

SELECT sprzedawca, SUM(ilosc * cena) AS wartosc_sprzedazy
FROM sprzedaż
GROUP BY sprzedawca;

KROK PO KROKU:

1. Powstają 3 grupy:

Anna → rekordy (1,2)

Jan → rekordy (3,4)

Marek → rekord (5)

2. Dla każdej grupy obliczana jest suma:

Anna:

(5 × 10) = 50

(3 × 25) = 75
→ Razem = 125

Jan:

(2 × 10) = 20

(1 × 40) = 40
→ Razem = 60

Marek:

(10 × 10) = 100
→ Razem = 100

Wynik zapytania:

sprzedawcawartosc_sprzedazy
Anna125
Jan60
Marek100

Dlaczego WHERE tu nie działa?

WHERE filtruje pojedyncze rekordy, zanim powstaną grupy.
A my chcemy filtrować całe grupy po obliczeniach.

Do tego służy HAVING.

Czym jest HAVING?

HAVING to „WHERE dla danych zagregowanych”.

WHERE → filtruje rekordy

HAVING → filtruje grupy

Przykład 2:
Wyświetl tylko tych sprzedawców, którzy sprzedali ponad 100 zł

SELECT sprzedawca, SUM(ilosc * cena) AS wartosc_sprzedazy
FROM sprzedaż
GROUP BY sprzedawca
HAVING SUM(ilosc * cena) > 100;

KROK PO KROKU:
1. Najpierw tworzy grupy (jak wcześniej).
2. Oblicza sumę wartości sprzedaży.
3. Dopiero teraz stosuje filtr HAVING:

Anna → 125 → >100 → ✔ wyświetl

Jan → 60 → ✘ nie wyświetl

Marek → 100 → ✘ (bo nie > 100)

Wynik:

sprzedawcawartosc_sprzedazy
Anna125

Przykład 3: Grupowanie po dwóch kolumnach

Pytanie:

„Ile sztuk każdego produktu sprzedał każdy sprzedawca?”

SELECT sprzedawca, produkt, SUM(ilosc) AS ilosc_sztuk
FROM sprzedaż
GROUP BY sprzedawca, produkt;

Tworzą się grupy typu:

Anna – Kwiaty

Anna – Nawozy

Jan – Kwiaty

Jan – Ziemia

Marek – Kwiaty

Kiedy stosujemy GROUP BY i HAVING?

✔ Gdy chcemy policzyć coś dla grup, np.:

sumę sprzedaży

średnią ocen

liczbę uczestników

maksymalną cenę

✔ Gdy chcemy filtrować po wynikach agregacji:

tylko grupy z SUM > X

tylko produkty, które mają MIN < X

tylko klienci kupili ponad 3 razy

Kiedy NIE stosować:

gdy chcemy filtrować pojedyncze rekordy → używamy WHERE

gdy nie korzystamy z agregacji → GROUP BY nie ma sensu

Kontakt: mgzsp22@gmail.com

© 2025. Wszystkie prawa zastrzeżone.

error: Content is protected !!