SQL Academy · Lekcja

ROLLUP dla sum częściowych

Obliczaj sumy częściowe i sumy końcowe

Lekcja 2 z 413 kroki

ROLLUP dla sum częściowych to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 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 jest ROLLUP

Po zgrupowaniu danych za pomocą GROUP BY otrzymują Państwo jeden wiersz na grupę. Często potrzebne są jednak również sumy częściowe dla poszczególnych grup oraz suma całkowita dla wszystkich wierszy. Właśnie to zapewnia ROLLUP.

ROLLUP jest rozszerzeniem GROUP BY, które automatycznie dodaje do zestawu wynikowego dodatkowe wiersze podsumowań, zapewniając sumy częściowe na każdym poziomie hierarchii grupowania oraz końcową sumę całkowitą.

Przygotowanie przykładowych danych

Utwórzmy prostą tabelę sales, na której będziemy ćwiczyć. Przechowuje ona region, kategorię produktu i kwotę sprzedaży dla każdej transakcji. Uruchom poniższe instrukcje, aby ją utworzyć i wypełnić danymi.

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

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Electronics', 300),
  ('East',  'Clothing',    150),
  ('West',  'Electronics', 700),
  ('West',  'Clothing',    200),
  ('West',  'Clothing',    100);

Najpierw zwykłe GROUP BY

Zanim użyjemy ROLLUP, zobaczmy, co zwraca zwykłe GROUP BY. Poniższe zapytanie zwraca jedną sumę dla każdej pary (region, category) — bez sum częściowych i bez sumy całkowitej.

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

Wprowadzenie do GROUP BY ROLLUP

Zastąp GROUP BY wyrażeniem GROUP BY ROLLUP(...), a SQL automatycznie doda wiersze sum częściowych. Kolumny wewnątrz ROLLUP() tworzą hierarchię, a suma częściowa jest generowana dla każdego poziomu tej hierarchii oraz na końcu tworzona jest suma całkowita.

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

Odczytywanie wyników ROLLUP

Wynik ROLLUP zawiera trzy rodzaje wierszy:

  • Wiersze szczegółowe — jeden wiersz dla każdej kombinacji (region, category), tak jak w przypadku zwykłego GROUP BY.
  • Wiersze sum częściowych — jeden wiersz dla każdego regionu, w którym category = NULL, przedstawiający sumę dla regionu.
  • Wiersz sumy całkowitej — jeden wiersz, w którym zarówno region, jak i category mają wartość NULL, przedstawiający sumę ogólną.

Wartości NULL pełnią funkcję zastępczą i oznaczają poziom podsumowania.

Używanie COALESCE do etykietowania wartości NULL

Znaczniki NULL mogą być mylące dla użytkowników końcowych. Obejmij każdą kolumnę funkcją COALESCE, aby zastąpić je znaczącymi etykietami, takimi jak 'Wszystkie kategorie' i 'Suma całkowita'.

SELECT
  COALESCE(region,   'Grand Total')    AS region,
  COALESCE(category, 'All Categories') AS category,
  SUM(amount)                          AS total
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

ROLLUP dla jednej kolumny

ROLLUP działa również tylko z jedną kolumną. Po zapisaniu ROLLUP(region) otrzymują Państwo jeden wiersz dla każdego regionu oraz pojedynczy wiersz sumy całkowitej na końcu. Jest to najprostsza forma, przydatna w każdym raporcie, który wymaga sumy narastającej poniżej wierszy szczegółowych.

SELECT
  COALESCE(region, 'Grand Total') AS region,
  SUM(amount)                     AS total
FROM   sales
GROUP  BY ROLLUP(region)
ORDER  BY region;

ROLLUP na trzech poziomach

Do ROLLUP można przekazać trzy lub więcej kolumn, aby budować głębsze hierarchie. Dla ROLLUP(year, region, category) otrzymaliby Państwo sumy częściowe dla każdej pary year+region, sumy częściowe dla każdego year oraz sumę całkowitą — każda dodatkowa kolumna dodaje kolejny poziom podsumowania.

-- Extend the demo with a year column
SELECT
  COALESCE(CAST(yr AS TEXT), 'All Years')     AS year,
  COALESCE(region,   'All Regions')            AS region,
  COALESCE(category, 'All Categories')         AS category,
  SUM(amount)                                  AS total
FROM (
  SELECT 2024 AS yr, region, category, amount FROM sales
  UNION ALL
  SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP  BY ROLLUP(yr, region, category)
ORDER  BY yr, region, category;

Rozpoznawanie wierszy podsumowań za pomocą GROUPING()

Funkcja GROUPING() zwraca 1, gdy wartość kolumny w danym wierszu jest wartością NULL wygenerowaną przez ROLLUP (zastępczym oznaczeniem podsumowania), oraz 0, gdy jest rzeczywistą wartością danych. Pozwala to odróżnić rzeczywiste wartości NULL od wartości NULL używanych w podsumowaniach ROLLUP.

SELECT
  region,
  category,
  SUM(amount)        AS total,
  GROUPING(region)   AS is_region_summary,
  GROUPING(category) AS is_cat_summary
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

Filtrowanie wierszy podsumowań

Ponieważ ROLLUP dodaje wiersze po agregacji, nie można filtrować ich za pomocą WHERE. Należy użyć HAVING albo umieścić całe zapytanie w podzapytaniu. Poniższy przykład pozostawia tylko sumy częściowe dla regionów (wiersze, w których category ma wartość NULL wygenerowaną przez ROLLUP, a region jest rzeczywistą wartością).

SELECT region, SUM(amount) AS regional_total
FROM   sales
GROUP  BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
   AND GROUPING(region)   = 0
ORDER  BY region;

ROLLUP a GROUPING SETS

ROLLUP(a, b) jest skróconym zapisem konkretnego zestawu GROUPING SETS. Poniższe dwa zapytania są dokładnie równoważne — ROLLUP pozwala uniknąć ręcznego wypisywania każdego poziomu grupowania.

-- Using ROLLUP (concise)
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),
  ()
);

Szybki test

Sprawdź swoją wiedzę o ROLLUP, odpowiadając na to pytanie.

Podsumowanie lekcji

Świetna praca! Oto podsumowanie tego, czego nauczyli się Państwo o ROLLUP:

  • GROUP BY ROLLUP(a, b) automatycznie generuje sumy częściowe dla każdego poziomu hierarchii kolumn oraz sumę całkowitą dla wszystkich wierszy.
  • Wiersze podsumowań są oznaczane wartością NULL w zwijanych kolumnach. Użyj COALESCE, aby nadać im czytelne etykiety.
  • Funkcja GROUPING() zwraca wartość 1 dla wartości NULL wygenerowanych przez ROLLUP i 0 dla rzeczywistych wartości danych, dzięki czemu można je od siebie odróżnić.
  • Użyj HAVING GROUPING(...) = 1, aby filtrować wyłącznie wiersze podsumowań.
  • ROLLUP(a, b) jest skróconym zapisem GROUPING SETS((a, b), (a), ()).

ROLLUP jest podstawowym narzędziem, gdy raport wymaga sum częściowych i sumy całkowitej bez pisania złożonych zapytań UNION.

Bezpłatny start

Ucz się SQL dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
46
Lekcje
183

Często zadawane pytania

Czy lekcja „ROLLUP dla sum częściowych” jest bezpłatna?

Tak — pełny tekst „ROLLUP dla sum częściowych” 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 „ROLLUP dla sum częściowych”?

Obliczaj sumy częściowe i sumy końcowe Ć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 2 z 4.

Ile czasu zajmuje lekcja „ROLLUP dla sum częściowych”?

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