0Pricing
SQL Academy · Lekcja

GROUPING SETS — wyjaśnienie

Wybieraj dokładnie te grupowania, których potrzebujesz

GROUPING SETS — wyjaśnienie to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym są GROUPING SETS?

Pisząc klauzulę GROUP BY, definiują Państwo jeden zestaw kolumn, według których następuje grupowanie. Czasami jednak potrzebnych jest kilka różnych grupowań w jednym zapytaniu — bez uruchamiania zapytania wielokrotnie i używania UNION ALL.

GROUPING SETS pozwala dokładnie określić, które grupowania są potrzebne, wykonując wszystko podczas jednego przebiegu danych. Każdy zestaw z listy generuje w wyniku własne zagregowane wiersze.

Przykładowa tabela: sales

W całej tej lekcji będziemy korzystać z tabeli sales. Zawiera ona transakcje zapisane według regionu, kategorii produktu i kwoty.

Proszę uruchomić kod, aby utworzyć i wypełnić tabelę oraz móc śledzić każdy przykład.

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Clothing',    200),
  ('West',  'Electronics', 300),
  ('West',  'Clothing',    400),
  ('North', 'Electronics', 150),
  ('North', 'Clothing',    250);

Dawne podejście: UNION ALL

Zanim pojawiło się GROUPING SETS, uzyskanie sum na wielu poziomach wymagało napisania osobnych zapytań i połączenia ich za pomocą UNION ALL. Takie rozwiązanie jest powtarzalne, trudniejsze do odczytania i wielokrotnie odczytuje tabelę.

Poniższy przykład zwraca sumy według regionu ORAZ sumy według kategorii — za pomocą trzech oddzielnych instrukcji SELECT.

SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region

UNION ALL

SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category

UNION ALL

SELECT NULL, NULL, SUM(amount)
FROM sales;

Składnia GROUPING SETS

Klauzulę GROUPING SETS umieszcza się wewnątrz zwykłej klauzuli GROUP BY lub zamiast niej. Każde żądane grupowanie należy zapisać jako listę kolumn ujętą w nawiasy. Pusty zestaw () oznacza sumę całkowitą — bez żadnego grupowania.

To pojedyncze zapytanie wykonuje dokładnie to samo co przedstawione wyżej trzy zapytania połączone za pomocą UNION ALL, ale jest krótsze i odczytuje tabelę tylko raz.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

Odczytywanie wyniku

Każdy wiersz wyniku należy dokładnie do jednego zestawu grupowania. Gdy kolumna nie należy do aktywnego zestawu grupowania, jej wartością jest NULL.

  • Wiersz z region = 'East' i category = NULL należy do zestawu (region).
  • Wiersz z region = NULL i category = 'Electronics' należy do zestawu (category).
  • Wiersz, w którym obie wartości są równe NULL, jest sumą całkowitą z zestawu ().

Te wartości NULL mają znaczenie strukturalne — oznaczają „wszystkie wartości” dla danego wymiaru, a nie brak danych.

Wielokolumnowe zestawy grupowania

Każdy zestaw grupowania może zawierać więcej niż jedną kolumnę. Zestaw (region, category) grupuje jednocześnie według obu kolumn, tak samo jak zwykłe GROUP BY region, category.

Połączenie go z pojedynczymi zestawami i sumą całkowitą pozwala uzyskać podsumowanie na czterech poziomach w jednym zapytaniu.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  (category),
  ()
);

Funkcja GROUPING()

Ponieważ NULL może oznaczać zarówno „ta kolumna nie była grupowana”, jak i rzeczywisty brak danych, SQL udostępnia funkcję GROUPING(), która pozwala je rozróżnić.

GROUPING(col) zwraca 1, gdy kolumna została pominięta w bieżącym zestawie grupowania (czyli jej NULL ma znaczenie strukturalne), oraz 0, gdy kolumna należy do grupowania (lub zawiera rzeczywistą wartość NULL).

SELECT
  region,
  category,
  SUM(amount)      AS total,
  GROUPING(region) AS is_region_total,
  GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

Zastępowanie etykiet NULL

Często zastępuje się strukturalne wartości NULL opisową etykietą, aby raporty były łatwiejsze do odczytania. Należy użyć CASE WHEN GROUPING(...) = 1 THEN 'All ...' ELSE col END, aby zastąpić etykietą tylko wiersze podsumowań.

SELECT
  CASE WHEN GROUPING(region)   = 1 THEN 'All Regions'    ELSE region   END AS region,
  CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
  SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

GROUPING SETS a ROLLUP

ROLLUP(a, b) to skrócona forma zestawów grupowania (a, b), (a), () — zawsze dodaje sumy częściowe wzdłuż hierarchii oraz sumę całkowitą.

GROUPING SETS zapewnia pełną kontrolę: można dokładnie wybrać, które kombinacje mają się pojawić. Jeśli pełna hierarchia nie jest potrzebna, można pominąć poszczególne poziomy. Dwa poniższe zapytania zwracają ten sam wynik.

-- Using ROLLUP
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);

-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

GROUPING SETS a CUBE

CUBE(a, b) generuje każdą możliwą kombinację wymienionych kolumn: (a, b), (a), (b), (). Jest przydatny do analizy międzywymiarowej, ale generuje wiele wierszy.

GROUPING SETS pozwala wybrać tylko interesujące Państwa kombinacje, dzięki czemu wynik pozostaje skoncentrowany, a zapytanie działa wydajnie.

-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);

-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

Praktyczny przypadek użycia: pulpit sprzedażowy

Rzeczywisty pulpit nawigacyjny często wymaga szczegółów na poziomie wierszy, sum częściowych dla działów oraz sumy całkowitej — wszystko to powinno znaleźć się w jednym zestawie wyników. GROUPING SETS pozwala uzyskać taki wynik w prosty sposób, bez agregowania danych po stronie aplikacji i bez wykonywania wielu żądań.

To zapytanie zwraca wiersze szczegółowe dla każdej pary region–kategoria, sumy częściowe tylko dla regionów oraz jeden wiersz sumy całkowitej — wszystko posortowane tak, aby suma całkowita pojawiła się na końcu.

SELECT
  COALESCE(region,   'TOTAL')      AS region,
  COALESCE(category, 'ALL')        AS category,
  SUM(amount)                      AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
)
ORDER BY
  GROUPING(region),
  region NULLS LAST,
  GROUPING(category),
  category NULLS LAST;

Szybki test

Sprawdźmy Państwa znajomość GROUPING SETS.

Podsumowanie lekcji

Oto, czego nauczyli się Państwo o GROUPING SETS:

  • GROUPING SETS pozwala definiować wiele kombinacji grupowania w jednym zapytaniu, zastępując powtarzalne wzorce z UNION ALL.
  • Każdy zestaw zapisuje się jako lista kolumn ujęta w nawiasy wewnątrz GROUP BY GROUPING SETS (...). Pusty zestaw () generuje sumę całkowitą.
  • Kolumny nienależące do aktywnego zestawu pojawiają się w danym wierszu jako NULL — do wykrywania tych strukturalnych wartości NULL służy GROUPING(col).
  • ROLLUP i CUBE są wygodnymi skrótami dla typowych wzorców, ale GROUPING SETS zapewnia pełną i precyzyjną kontrolę nad uwzględnianymi grupowaniami.
  • Połączenie z COALESCE lub CASE WHEN GROUPING(...) pozwala zastąpić wartości NULL czytelnymi etykietami w raportach.

Często zadawane pytania

Czy lekcja „GROUPING SETS — wyjaśnienie” jest bezpłatna?

Tak — pełny tekst „GROUPING SETS — wyjaśnienie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „GROUPING SETS — wyjaśnienie”?

Wybieraj dokładnie te grupowania, których potrzebujesz Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „GROUPING SETS — wyjaśnienie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Co dalej po pojedynczym GROUP BY
  2. ROLLUP dla sum częściowych
  3. CUBE dla wszystkich kombinacji
  4. GROUPING SETS — wyjaśnienie
← Powrót do SQL Academy