Problém:
Chcete najít skupiny řádků, ve kterých je průměr hodnot ve sloupci vyšší nebo nižší než daná hodnota.
Příklad:
Naše databáze obsahuje tabulku s názvem product
s údaji v následujících sloupcích:id
, name
, grocery
a price
.
id | jméno | potraviny | cena |
---|---|---|---|
1 | mléko | Zelený obchod | 2,34 |
2 | chléb | Clark’s Grocery | 3,56 |
3 | chléb | Super trh | 4.15 |
4 | mléko | Super trh | 1,80 |
5 | chléb | Potraviny Amanda | 2.26 |
6 | mléko | Violet Grocery | 3,45 |
7 | mléko | Clark’s Grocery | 2.10 |
8 | chléb | Violet Grocery | 2,55 |
9 | mléko | Potraviny Amanda | 1,95 |
Pojďme najít názvy produktů, ve kterých je průměrná cena každého produktu mezi potravinami vyšší než 3,00.
Řešení:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Zde je výsledek:
name | průměr |
---|---|
chléb | 3.13 |
Diskuse:
Chcete-li filtrovat záznamy pomocí agregační funkce, použijte klauzuli HAVING.
Zde vypočítáme agregovanou hodnotu:průměrnou cenu každého produktu. Jeden prodává více než jeden obchodník s potravinami; proto se průměrná cena vypočítá pro každou (v našem příkladu SELECT name, AVG(price)
). Kromě agregační funkce používáme v SELECT také název sloupce, takže bychom s tímto názvem sloupce měli použít GROUP BY (GROUP BY name
).
Posledním krokem je použití agregační funkce v klauzuli HAVING. Pamatujte, že HAVING by mělo být uvedeno za klauzuli GROUP BY. Obsahuje podmínku, která porovnává hodnotu vrácenou agregační funkcí s danou hodnotou. Výše je průměrná cena produktu s hodnotou 3,00 (HAVING AVG(price)>3.00
). V tomto dotazu zkontrolujeme, zda je průměrná cena každého produktu ve všech potravinách vyšší než tři. Dotaz zobrazil pouze jeden produkt, chléb, s průměrnou cenou vyšší než tři.