Проблем:
Искате да намерите групи от редове, в които средната стойност на стойностите в колона е по-висока или по-ниска от дадена стойност.
Пример:
Нашата база данни има таблица с име product
с данни в следните колони:id
, name
, grocery
и price
.
id | име | хранителни стоки | цена |
---|---|---|---|
1 | мляко | Зелен магазин | 2,34 |
2 | хляб | Хранителни стоки на Кларк | 3,56 |
3 | хляб | Супер пазар | 4.15 |
4 | мляко | Супер пазар | 1,80 |
5 | хляб | Хранителни стоки Аманда | 2.26 |
6 | мляко | Виолетови хранителни стоки | 3,45 |
7 | мляко | Хранителни стоки на Кларк | 2.10 |
8 | хляб | Виолетови хранителни стоки | 2,55 |
9 | мляко | Хранителни стоки Аманда | 1,95 |
Нека намерим имената на продуктите, при които средната цена на всеки продукт сред хранителните стоки е по-висока от 3,00.
Решение:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Ето резултата:
name | ср. |
---|---|
хляб | 3.13 |
Дискусия:
За да филтрирате записи с помощта на агрегатната функция, използвайте клаузата HAVING.
Тук изчисляваме общата стойност:средната цена на всеки продукт. Един се продава от повече от един бакалин; следователно средната цена се изчислява за всеки (в нашия пример, SELECT name, AVG(price)
). Освен агрегатната функция, ние също използваме името на колоната в SELECT, така че трябва да използваме GROUP BY с това име на колона (GROUP BY name
).
Последната стъпка е използването на агрегатната функция в клаузата HAVING. Не забравяйте, че HAVING трябва да се постави след клаузата GROUP BY. Той съдържа условието, което сравнява стойността, върната от агрегатната функция, с дадена стойност. По-горе това е средната цена на продукта със стойност 3,00 (HAVING AVG(price)>3.00
). В тази заявка проверяваме дали средната цена на всеки продукт във всички хранителни стоки е по-висока от три. Заявката показва само един продукт, хляб, със средна цена, по-висока от три.