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