Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

GROUP BY

Termin Definicja
GROUP BY

GROUP BY to klauzula Transact-SQL grupująca wiersze o wspólnych wartościach w celu wykonania na nich funkcji agregujących.

Jak GROUP BY porządkuje wiersze w Transact-SQL

GROUP BY jest klauzulą języka Transact-SQL używaną do podziału wyniku zapytania na grupy wierszy mających takie same wartości w określonych kolumnach lub wyrażeniach. Sama klauzula nie oblicza jeszcze podsumowania. Jej praktyczne znaczenie ujawnia się razem z funkcjami agregującymi, takimi jak COUNT, SUM, AVG, MIN i MAX. Dzięki temu można na przykład policzyć liczbę rekordów przypadających na każdą kategorię, wyznaczyć sumę wartości dla poszczególnych klientów albo znaleźć największą i najmniejszą wartość w każdej grupie.

Jeżeli zapytanie zawiera GROUP BY, elementy umieszczone w SELECT muszą być prawidłowo powiązane z grupowaniem. Kolumna występująca w wyniku musi znajdować się w klauzuli GROUP BY albo być argumentem funkcji agregującej. Konstrukcja SELECT kategoria, COUNT(*) FROM Produkty GROUP BY kategoria zwraca jeden wiersz dla każdej odrębnej wartości kolumny kategoria. Nie zwraca natomiast pojedynczego wiersza dla każdego produktu, ponieważ po grupowaniu szczegółowe wiersze zostały zastąpione przez wynik grupy.

Różnica między filtrowaniem WHERE i HAVING

W zapytaniu z GROUP BY ważne jest rozróżnienie między WHERE a HAVING. WHERE odrzuca pojedyncze wiersze przed utworzeniem grup. Można go użyć na przykład do uwzględnienia wyłącznie rekordów z określonego okresu albo tylko pozycji spełniających warunek dotyczący kolumny źródłowej. HAVING działa po utworzeniu grup i służy przede wszystkim do filtrowania wyników agregacji. Warunek HAVING COUNT(*) > 10 pozostawi tylko te grupy, które zawierają więcej niż dziesięć wierszy.

Typowy przepływ logiczny zapytania można opisać następująco: najpierw przetwarzane są źródła danych i ewentualne złączenia, następnie działa WHERE, później GROUP BY tworzy grupy, a HAVING odrzuca całe grupy niespełniające warunku. Dopiero później formowany jest wynik SELECT i stosowane może być sortowanie ORDER BY. Ta kolejność wyjaśnia, dlaczego agregacji nie używa się zwykle bezpośrednio w WHERE. Wiersze nie zostały jeszcze wtedy zgrupowane, więc wynik funkcji COUNT, SUM lub AVG nie jest jeszcze dostępny.

Agregaty, wartości NULL i wyrażenia grupujące

Funkcje agregujące mają określone zasady traktowania wartości NULL. COUNT(*) liczy wszystkie wiersze należące do grupy, również te, w których wybrane kolumny zawierają NULL. Z kolei COUNT(nazwa_kolumny) pomija wiersze, w których wskazana kolumna ma wartość NULL. Funkcje SUM, AVG, MIN i MAX również pomijają NULL w obliczanej kolumnie. Jeżeli wszystkie wartości analizowane przez daną funkcję są NULL, wynik agregacji może być NULL, dlatego w razie potrzeby stosuje się funkcję COALESCE.

GROUP BY może obejmować więcej niż jedną kolumnę. Wtedy grupa jest wyznaczana przez unikalną kombinację wartości ze wszystkich wskazanych kolumn, a nie przez każdą kolumnę niezależnie. Grupowanie po rok i miesiac pozwala otrzymać osobne podsumowania dla poszczególnych miesięcy każdego roku. Wartości NULL w kolumnie grupującej są traktowane jako jedna wspólna wartość grupująca, więc wiersze z NULL mogą trafić do tej samej grupy.

W Transact-SQL można grupować także według wyrażeń, na przykład według fragmentu daty uzyskanego przez DATEPART albo według wyniku funkcji warunkowej CASE. Trzeba jednak zachować zgodność między wyrażeniem w SELECT i wyrażeniem w GROUP BY. Alias nadany kolumnie w tej samej liście SELECT nie zawsze może być użyty bezpośrednio w GROUP BY, ponieważ alias jest ustalany na późniejszym etapie wiązania zapytania. W takich sytuacjach czytelniejszym rozwiązaniem jest powtórzenie wyrażenia albo użycie podzapytania lub wyrażenia CTE.

GROUP BY w podsumowaniach wielopoziomowych

Transact-SQL udostępnia rozszerzenia pozwalające tworzyć więcej niż jeden poziom agregacji w jednym zapytaniu. GROUP BY ROLLUP generuje podsumowania hierarchiczne, na przykład wyniki dla każdego oddziału i miesiąca, następnie sumy dla każdego oddziału oraz sumę końcową. GROUP BY CUBE tworzy kombinacje podsumowań dla wszystkich wskazanych wymiarów, a GROUPING SETS pozwala jawnie określić, które zestawy kolumn mają zostać potraktowane jako osobne poziomy grupowania. Przy odczytywaniu takich wyników przydatne są funkcje GROUPING i GROUPING_ID, które pomagają odróżnić zwykłą wartość NULL od NULL użytego jako oznaczenie wiersza podsumowania.

Podczas diagnostyki zapytania z GROUP BY należy sprawdzić przede wszystkim, czy grupowane kolumny odpowiadają oczekiwanemu poziomowi szczegółowości, czy agregat nie jest wykonywany po niewłaściwym złączeniu oraz czy warunek HAVING nie usuwa potrzebnych grup. Złączenie tabeli zawierającej wiele pasujących rekordów może zwielokrotnić wiersze przed agregacją, a w konsekwencji zawyżyć COUNT lub SUM. Warto również porównać zapytanie agregujące z zapytaniem pokazującym rekordy szczegółowe i sprawdzić plan wykonania, gdy duża liczba danych powoduje długi czas działania. W przypadku problemów z samą składnią albo niepoprawnymi wynikami zapytania Transact-SQL konieczna jest analiza źródła danych, definicji kolumn, warunków złączeń i logiki grupowania.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę