< 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í >