Problém:
Musíte najít řádky, ve kterých skupiny mají součet hodnot v jednom sloupci menší než daná hodnota.
Příklad:
Naše databáze obsahuje tabulku s názvem company
s údaji v následujících sloupcích:id
, department
, first_name
, last_name
a salary
.
id | oddělení | first_name | last_name | plat |
---|---|---|---|---|
1 | marketing | Lora | Hnědá | 2300 |
2 | finance | Jan | Jackson | 3200 |
3 | marketing | Michael | Thomson | 1270 |
4 | výroba | Tony | Miller | 6500 |
5 | výroba | Sally | Zelená | 2500 |
6 | finance | Olivier | Černá | 3450 |
7 | výroba | Jeniffer | Michelin | 2800 |
8 | marketing | Jeremy | Lorson | 3600 |
9 | marketing | Louis | Smith | 4200 |
Pojďme najít názvy oddělení, která mají součty platů svých zaměstnanců nižší než 7000.
Řešení:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Zde je výsledek:
oddělení | součet |
---|---|
finance | 6550 |
Diskuse:
Chcete-li filtrovat záznamy pomocí agregační funkce (funkce SUM z dřívější doby), použijte klauzuli HAVING. Chcete-li vypočítat součet hodnot pro každou skupinu řádků, použijte funkci agregace SUM. V tomto dotazu se sloupec oddělení počítá se součtem všech mezd jeho zaměstnanců jako skupina (vypočítejte to funkcí SUM se sloupcem plat jako argumentem). Protože vypočítáváte hodnotu pro každou skupinu řádků (řádky seskupujeme podle názvu oddělení), má dotaz klauzuli GROUP BY s názvem sloupce do skupiny řádků (v našem příkladu GROUP BY department
). 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. HAVING obsahuje podmínku porovnávající hodnotu vrácenou agregační funkcí s danou hodnotou. Shora jsou to součty platů s hodnotou menší než 7000 (SUM(salary)<7000
). Zde ověřujeme, že suma platů v každém oddělení je nižší než 7000. Dotaz zobrazil pouze jedno oddělení, finance, s platy 6550.