Grupowanie danych pozwala na podzielenie wszystkich danych na logiczne zbiory, co umożliwia wykonanie obliczeń statystycznych oddzielnie w każdej grupie.
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.
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.
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.