< Self join | SQL postupně | Agregace pokračování >
Databáze obsahují množství číselných údajů, ze kterých lze vypočítat různé souhrny: součet, průměr, maximum, minimum. Také ostatní údaje lze počítat:  kolik jich je jako takových, nebo kolik jich je navzájem různých. Můžeme počítat i počty řádků bez ohledu na to, co je v nich.
K tomu slouží dotazy s agregačními funkcemi:
- sum(<výraz>) ...součet výraz
 - avg(<výraz>) ...průměr z výraz
 - min(<výraz>) ...minimum z výraz
 - max(<výraz>) ...maximum z výrazu
 - count(<výraz>) ...počet neprázdných (not NULL) hodnot výrazu
 - count(*) ...počet řádků
 - count(distinct <výraz>) ...počet různých hodnot výrazu
 
Dá se počítat souhrn z celé tabulky nebo z nějaké její části:
Příklad: Spočítejte průměrnou cenu limonád.
        select avg(JCEN) as PRUM_CENA
        from ZBOZ
        where KAT='limo'; | 
Příklad: Spočítejte počet všech druhů zboží.
        select count(*) as POCET_ZBOZI
        from ZBOZ; | 
Příklad: Spočítejte počet aktivních druhů zboží.
        select count(*) as POCET_ZBOZI
        from ZBOZ
        where AKTI=1; | 
Příklad: Spočítejte počet různých druhů zboží, které byly někdy objednány .
        select count(distinct KOD) as POCET_OBJEDNAVANYCH_ZBOZI
        from POLOZ; | 
Příklad: Spočítejte počet objednávek a počet odeslaných objednávek.
        select count(*) as POCET_OBJEDNAVEK, count(DATOD) as POCET_ODESLANYCH
        from OBJ; | 
  | Většinou chceme v dotazu s agregací specifikovat rozdělení do skupin, v nichž se má agregace počítat. K tomu slouží klauzule GROUP BY. | 
Příklad: Spočítejte průměrnou cenu zboží podle kategorií a počet druhů zboží v té kategorii.
        select KAT, avg(JCEN) as PRUM_CENA, count(*) as POCET_ZBOZI
        from ZBOZ
        group by KAT; | 
| Následující příkaz výsledek uspořádá podle té průměrné ceny sestupně: | 
        select KAT, avg(JCEN) as PRUM_CENA, count(*) as POCET_ZBOZI
        from ZBOZ
        group by KAT
        order by 2 desc; | 
Příklad: Spočítejte počty druhů zboží podle kategorií, rozdělte na aktivní a neaktivní.
        select KAT, AKTI, count(*) as POCET_ZBOZI
        from ZBOZ
        group by KAT, AKTI
        order by 1,2 desc; | 
Příklad: Spočítejte počet aktivních druhů zboží pro každou kategori.
        select KAT, count(*) as POCET_AKTI_ZBOZI
        from ZBOZ
        where AKTI=1
        group by KAT; | 
Příklad: Spočítejte počet objednávek s firemním rozvozem (DOPR=2) v jednotlivých letech.
        select extract(year from DAT) as ROK, count(*) as POCET_ROZVAZENYCH_OBJEDNAVEK
        from OBJ
        where DOPR=2
        group by extract(year from DAT)
        order by 1,2; | 
| Funkce extract() je specifická pro Oracle. V ostatních databázových systémech mají podobné funkce jiné názvy. | 
Příklad: Spočítejte počet objednávek v jednotlivých letech, rozdělte podle typu dopravy.
        select extract(year from DAT) as ROK, DOPR, count(*) as POCET_OBJEDNAVEK
        from OBJ
        group by extract(year from DAT),DOPR
        order by 1,2; | 
Příklad: Pro každou objednávku spočítejte celkovou částku za zboží.
        select CISO,sum(VCEN) as MEZISOUCET
        from POLOZ
        group by CISO
        order by 1; | 
  | Můžeme chtít vybrat jen skupiny, které splňují nějakou podmínku. Smyslupné podmínky v takovém případě se týkají vypočtených agregací. K tomu slouží klauzule HAVING. (Do klauzele WHERE je napsat nelze...!) | 
Příklad: Které objednávky byly za více než 1000?
        select CISO
        from POLOZ
        group by CISO
        having sum(VCEN) > 1000; | 
Příklad: Ve kterých kategoriích jsou méně než 4 aktivní druhy zboží?
        select KAT
        from ZBOZ
        where AKTI=1
        group by KAT
        having count(*) < 4; | 
< Self join | SQL postupně | Agregace pokračování >