TOP

Lekcja SQL 8. Grupowanie danych (GROUP BY)

Grupowanie danych pozwala na podzielenie wszystkich danych na logiczne zbiory, co umożliwia wykonanie obliczeń statystycznych oddzielnie w każdej grupie.


1. Tworzenie grup (GROUP BY)

Grupy tworzone są przy użyciu instrukcji GROUP BY operatora SELECT. Rozważmy przykład.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

W ramach tej prośby pozyskaliśmy informacje na temat liczby produktów sprzedanych w każdym miesiącu. Operator SELECT nakazuje wyprowadzenie dwóch kolumn Produkt - nazwa produktu oraz Product_num - pole wyliczane, które utworzyliśmy w celu wyświetlenia ilości sprzedanych produktów (formuła pola SUM(Quantity)). Klauzula GROUP BY informuje system DBMS o grupowaniu danych według kolumny Produkt.

Warto również zauważyć, że GROUP BY musi występować po klauzuli WHERE i przed ORDER BY.

2. Grupy filtrowania (HAVING)

Podobnie jak filtrowaliśmy wiersze w tabeli, możemy filtrować według pogrupowanych danych. W tym celu w SQL służy operator HAVING. Weźmy poprzedni przykład i dodajmy filtrowanie grupowe.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Widzimy, że po obliczeniu liczby sprzedanych towarów dla każdego produktu, DBMS „odciął” te produkty, których sprzedano w ilości mniejszej niż 4000 sztuk.

Jak widać, operator HAVING jest bardzo podobny do operatora WHERE, jednak jest między nimi znacząca różnica: WHERE filtruje dane przed ich zgrupowaniem, a HAVING filtruje po zgrupowaniu. Tym samym wiersze usunięte za pomocą klauzuli WHERE nie zostaną uwzględnione w grupie. Zatem operatory WHERE i HAVING mogą być użyte w tym samym zdaniu. Rozważmy przykład:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Do poprzedniego przykładu dodaliśmy operator WHERE, gdzie określiliśmy produkt „Długie narty”, co z kolei wpłynęło na grupowanie według operatora HAVING. W efekcie widzimy, że produkt „Narty Długie” nie znalazł się na liście grup posiadających ponad 4000 sprzedanych produktów.

3. Grupowanie i sortowanie

Podobnie jak w przypadku normalnego próbkowania danych, grupy możemy sortować po zgrupowaniu za pomocą operatora HAVING. W tym celu możemy użyć znanego już operatora ORDER BY. W tej sytuacji jego zastosowanie jest podobne do poprzednich przykładów. Przykład:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

lub po prostu podaj numer pola w kolejności, w jakiej chcemy sortować:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

Widzimy, że aby posortować wyniki podsumowania, wystarczy napisać klauzulę z ORDER BY po operatorze HAVING.

MS Access nie obsługuje sortowania grup po aliasach kolumn, czyli w naszym przykładzie, aby posortować wartości, nie będziemy mogli napisać na końcu zapytania ORDER BY Product_num.