602SQL-Úplná dokumentace Index  

Agregační funkce (SQL)

agregační_funkce ::= { COUNT | SUM | AVG | MIN | MAX } ([ ALL | DISTINCT ] výraz) | COUNT(*)

Agregační funkce počítají nad množinou hodnot výrazu v odpovědi na dotaz počet hodnot (COUNT), součet (SUM), průměr (AVG), minimum (MIN) a maximum (MAX). Výpočet se provádí buď nad všemi záznamy v odpovědi na dotaz (pokud dotaz neobsahuje GROUP BY) nebo nad každou skupinou určenou GROUP BY. Argumentem těchto funkcí může být libovolný výraz neobsahující jinou agregační funkci - hodnota funkce se počítá z těch hodnot argumentů, které jsou různé od NULL. Pro funkce SUM a AVG argument musí být číselného typu, pro funkce MAX a MIN buď číselného typu nebo některého z typů typu DATE, TIME, TIMESTAMP, BOOLEAN a řetězec znaků.

Mimo to argumentem funkce COUNT smí být také znak *, v takovém případě funkce vrací počet všech hodnot, včetně těch, které se rovnají NULL.

Pokud se před argumentem funkce uvede DISTINCT, uvažují se pouze různé hodnoty argumentů (u funkcí MAX a MIN to nemá žádný význam), pokud se uvede ALL nebo se neuvede nic, uvažují se všechny hodnoty.

Agregační funkce se v dotazech používají v klauzuli SELECT nebo HAVING. Nelze je používat v klauzulích WHERE nebo GROUP BY. V klauzuli ORDER BY je nutno je nahradit jménem výsledného sloupce, které lze specifikovat pomocí AS v klauzuli SELECT.

Pokud funkce pracují nad prázdnou množinou hodnot, pak COUNT vrací 0 a ostatní funkce vracejí NULL.

Odchylky od Intermediate level směrem k Full level nebo k SQL 3

Odchylky od Intermediate level směrem k Entry level

Implementací definované vlastnosti SQL ve 602SQL

Příklad použití:

Spočítat faktury

SELECT COUNT(cislo) FROM Faktury 

Vybrat faktury s hodnotou rovné minimální

SELECT *
FROM Faktury
WHERE castka = (SELECT MIN(castka) FROM faktury)

Vybrat firmy, které mají faktury za více než 10000 (tento dotaz lze zapsat efektivněji s využitím klauzule HAVING):

SELECT A.nazev
FROM Firmy A
WHERE 10000 < (SELECT SUM(B.castka)
              FROM Faktury B
              WHERE A.cislo=B.firma)

Zjistit počet firem, které mají alespoň jednu fakturu za víc než 5000

SELECT COUNT (DISTINCT Firmy.nazev) 
    FROM Faktury,Firmy
    WHERE (castka > 5000)
      AND (Firmy.cislo=Faktury.firma)