SQL GROUP BY a agregačné funkcie: Zhrňte svoje dáta

Published: 2026-04-08

GROUP BY zbalí viacero riadkov, ktoré majú rovnakú hodnotu v jednom alebo viacerých stĺpcoch, do jedného sumarizačného riadku. V kombinácii s agregačnými funkciami ako COUNT, SUM, AVG, MIN a MAX tvorí základ takmer každého reportovacieho a analytického dotazu. GROUP BY je podporované vo všetkých SQL databázach vrátane SQLite, PostgreSQL, MySQL, SQL Server a Oracle.

Vzorové dáta

Vo všetkých príkladoch používame dve tabuľky:

Tabuľka employees:

id name department hire_date salary
1 Alice Engineering 2023-01-15 95000
2 Bob Engineering 2023-06-01 85000
3 Carol Engineering 2024-03-10 85000
4 Dave Sales 2023-02-20 72000
5 Eve Sales 2023-09-05 68000
6 Frank Sales 2024-01-15 65000
7 Grace Marketing 2023-04-01 82000
8 Henry Marketing 2024-06-01 70000

Tabuľka orders:

id customer product category quantity unit_price order_date status
1 Acme Corp Laptop Pro Electronics 3 1299.99 2026-01-05 delivered
2 Acme Corp Wireless Mouse Electronics 10 29.99 2026-01-12 delivered
3 Globex Office Chair Furniture 5 249.99 2026-01-18 delivered
4 Globex Standing Desk Furniture 2 599.99 2026-01-20 shipped
5 Initech Notebook Pack Stationery 20 12.99 2026-02-03 delivered
6 Initech Pen Set Stationery 15 8.99 2026-02-07 delivered
7 Acme Corp Monitor 27" Electronics 4 399.99 2026-02-14 delivered
8 Umbrella Ltd Laptop Pro Electronics 2 1299.99 2026-02-20 cancelled
9 Umbrella Ltd Desk Lamp Furniture 8 39.99 2026-03-01 delivered
10 Globex Wireless Mouse Electronics 12 29.99 2026-03-05 shipped
11 Initech Monitor 27" Electronics 1 399.99 2026-03-10 delivered
12 Acme Corp Standing Desk Furniture 1 599.99 2026-03-15 processing
Preskúmajte dataset v DbGate Lite

Syntax GROUP BY

SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1
HAVING aggregate_condition
ORDER BY column1;
  • GROUP BY — jeden alebo viac stĺpcov, ktorých jedinečné kombinácie hodnôt definujú každú skupinu
  • Agregačné funkcie — vypočítajú jednu hodnotu zo všetkých riadkov v skupine
  • HAVING — filtruje skupiny (ako WHERE, ale pre zoskupené výsledky)
  • Každý stĺpec v SELECT, ktorý nie je vo vnútri agregácie, musí byť uvedený v GROUP BY

Poradie vykonávania SQL

SQL klauzuly sa píšu v jednom poradí, ale vykonávajú sa v inom. Pochopenie tohto poradia vysvetľuje, prečo HAVING môže odkazovať na agregačné funkcie, ale WHERE nie, a prečo nemôžete použiť alias zo SELECT v klauzule HAVING.

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
Krok Klauzula Čo sa deje
1 FROM Načítajú sa tabuľky a vyhodnotia sa prípadné JOIN-y
2 WHERE Filtrovanie jednotlivých riadkov — agregačné funkcie tu nie sú povolené
3 GROUP BY Zostávajúce riadky sa zbalí do skupín
4 HAVING Filtrovanie skupín — agregačné funkcie sú tu povolené
5 SELECT Vypočítajú sa výstupné stĺpce a aliasy
6 ORDER BY Zoradenie finálnej množiny výsledkov

Preto WHERE status = 'delivered' beží pred zoskupovaním (rýchly filter na úrovni riadkov), zatiaľ čo HAVING COUNT(*) > 2 beží po zoskupovaní (filtruje celé skupiny).

COUNT()

COUNT(*) počíta všetky riadky v skupine. COUNT(column) počíta nenulové (non-NULL) hodnoty v danom stĺpci.

Príklad: Počet zamestnancov podľa oddelenia

Príklad: Počet objednávok podľa zákazníka

Príklad: Počet doručených vs. ostatných stavov

Počítajte iba objednávky spĺňajúce podmienku pomocou COUNT s výrazom CASE:

SUM()

SUM(column) sčíta všetky hodnoty v skupine pre číselný stĺpec.

Príklad: Celková mzda podľa oddelenia

Príklad: Celkové tržby podľa kategórie

Vypočítajte tržby ako quantity * unit_price:

Príklad: Tržby podľa zákazníka a kategórie

Zoskupte podľa viacerých stĺpcov, aby ste tržby rozčlenili podrobnejšie:

AVG()

AVG(column) vráti aritmetický priemer všetkých nenulových hodnôt v skupine.

Príklad: Priemerná mzda podľa oddelenia

Príklad: Priemerná hodnota objednávky podľa zákazníka

MIN() a MAX()

MIN(column) a MAX(column) vrátia najmenšiu a najväčšiu hodnotu v skupine.

Príklad: Rozpätie miezd podľa oddelenia

Príklad: Prvý a posledný dátum objednávky podľa zákazníka

Kombinovanie viacerých agregácií

V jednom dotaze môžete skombinovať ľubovoľný počet agregačných funkcií.

Príklad: Kompletný prehľad oddelenia

Príklad: Prehľad objednávok podľa zákazníka

HAVING

HAVING filtruje skupiny po agregácii — je ekvivalentom WHERE pre zoskupené výsledky.

Príklad: Oddelenia s viac ako dvoma zamestnancami

Príklad: Zákazníci s celkovými tržbami nad 2000

Príklad: Kategórie s priemernou hodnotou objednávky pod 500

WHERE vs. HAVING

WHERE filtruje jednotlivé riadky pred zoskupovaním. HAVING filtruje skupiny po agregácii.

Príklad: Tržby iba z doručených objednávok podľa zákazníka

Použite WHERE na vylúčenie riadkov pred zoskupovaním a potom HAVING na filtrovanie výsledkov:

GROUP BY s JOIN-mi

Môžete zoskupovať dáta, ktoré sú rozložené vo viacerých tabuľkách, tak, že ich najprv spojíte.

Príklad: Tržby podľa oddelenia cez JOIN na zamestnancov

Príklad: Počet objednávok a tržby podľa kategórie a mesiaca

GROUP BY s výrazmi

Môžete zoskupovať podľa vypočítaných výrazov, nielen podľa jednoduchých stĺpcov.

Príklad: Zamestnanci prijatí podľa roku

Príklad: Objednávky podľa mesiaca

COUNT(DISTINCT)

COUNT(DISTINCT column) počíta počet jedinečných hodnôt v skupine.

Príklad: Jedinečné produkty objednané podľa zákazníka

Filtrovanie skupín s viacerými podmienkami

HAVING podporuje akýkoľvek booleovský výraz vrátane kombinácií AND/OR.

Príklad: Hodnotní aktívni zákazníci

Nájdite zákazníkov s viac ako jednou objednávkou a celkovými tržbami nad 1000:

Praktický príklad: Predajný report

Skombinujte všetko do kompletného prehľadu predaja.

Príklad: Report výkonnosti kategórií

Príklad: Najlepší produkt podľa tržieb

GROUP BY vs. okenné funkcie

GROUP BY zbalí riadky do jedného riadku na skupinu. Okenné funkcie ponechajú všetky riadky a pridajú vypočítaný stĺpec — podrobnosti nájdete v tutoriáli o SQL okenných funkciách.

Príklad: GROUP BY vráti jeden riadok na oddelenie

Príklad: Okenná funkcia ponechá všetky riadky

Bežné použitia GROUP BY

  • Reportovacie dashboardy — sumarizácia súčtov, priemerov a počtov podľa kategórie alebo časového obdobia
  • Analýza počtu ľudí — počítanie zamestnancov, používateľov alebo záznamov podľa skupiny
  • Rozpis tržieb — celkové a priemerné tržby podľa produktu, regiónu alebo zákazníka
  • Analýza trendov — zoskupovanie podľa mesiaca alebo roku na odhalenie vzorov v čase
  • Top-N v rámci skupiny — kombinácia s poddotazmi alebo CTE na nájdenie najlepšieho „výkonára“ v každej skupine
  • Validácia dát — počítanie duplikátov alebo NULL hodnôt v skupinách
  • Cohort analýza — zoskupovanie používateľov podľa dátumu registrácie alebo behaviorálneho segmentu

Tipy na výkon

  1. Indexujte stĺpce v GROUP BY — indexy na zoskupovaných stĺpcoch zrýchľujú krok triedenia a zoskupovania
  2. Filtrujte skoro pomocou WHERE — zníženie počtu riadkov pred zoskupovaním pomocou WHERE je rýchlejšie než filtrovanie po zoskupovaní pomocou HAVING
  3. Vyhnite sa SELECT * — vyberajte iba stĺpce, ktoré skutočne potrebujete; agregačné operácie profitujú z užších dát
  4. Používajte pokrývajúce indexy — index, ktorý obsahuje aj stĺpec z GROUP BY aj agregovaný stĺpec, môže zabrániť úplnému skenu tabuľky
  5. Zvážte materializované pohľady — pri často počítaných agregáciách nad veľkými tabuľkami niektoré databázy podporujú predpočítané sumáre

Zhrnutie

  • GROUP BY zbalí riadky, ktoré zdieľajú rovnaké hodnoty stĺpcov, do jedného sumarizačného riadku pre každú jedinečnú kombináciu
  • COUNT(*) počíta všetky riadky; COUNT(column) počíta nenulové hodnoty; COUNT(DISTINCT column) počíta jedinečné hodnoty
  • SUM sčítava číselné hodnoty; AVG počíta priemer; MIN / MAX nájdu hranice
  • Každý stĺpec v SELECT musí buď byť v GROUP BY, alebo byť zabalený v agregačnej funkcii
  • WHERE filtruje riadky pred zoskupovaním; HAVING filtruje skupiny po agregácii
  • Môžete GROUP BY použiť na výrazy (napr. SUBSTR(date, 1, 7) pre zoskupenie na úrovni mesiacov)
  • Spájanie tabuliek pred zoskupovaním vám umožní skombinovať dáta z viacerých zdrojov do jedného reportu
  • Použite okenné funkcie namiesto GROUP BY, keď potrebujete metriky na úrovni skupiny bez straty jednotlivých riadkov

Skúste kombinovať GROUP BY s JOIN-mi, výrazmi CASE a klauzulami HAVING, aby ste vytvorili reporty, ktoré vaše dátové analýzy potrebujú!