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 |
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
- Indexujte stĺpce v GROUP BY — indexy na zoskupovaných stĺpcoch zrýchľujú krok triedenia a zoskupovania
- Filtrujte skoro pomocou WHERE — zníženie počtu riadkov pred zoskupovaním pomocou WHERE je rýchlejšie než filtrovanie po zoskupovaní pomocou HAVING
- Vyhnite sa SELECT * — vyberajte iba stĺpce, ktoré skutočne potrebujete; agregačné operácie profitujú z užších dát
- 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
- 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ú!