Проблем:
Искате да намерите групи от редове, в които средната стойност на стойностите в колона е по-висока или по-ниска от дадена стойност.
Пример:
Нашата база данни има таблица с име 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 ). В тази заявка проверяваме дали средната цена на всеки продукт във всички хранителни стоки е по-висока от три. Заявката показва само един продукт, хляб, със средна цена, по-висока от три.