Проблем:
Трябва да намерите редове, в които групите имат сума от стойности в една колона, по-малка от дадена стойност.
Пример:
Нашата база данни има таблица с име company
с данни в следните колони:id
, department
, first_name
, last_name
и salary
.
id | отдел | first_name | фамилно_име | заплата |
---|---|---|---|---|
1 | маркетинг | Лора | Кафяв | 2300 |
2 | финанси | Джон | Джаксън | 3200 |
3 | маркетинг | Майкъл | Томсън | 1270 |
4 | производство | Тони | Милър | 6500 |
5 | производство | Сали | Зелено | 2500 |
6 | финанси | Оливие | Черно | 3450 |
7 | производство | Дженифър | Мишлен | 2800 |
8 | маркетинг | Джереми | Лорсън | 3600 |
9 | маркетинг | Луис | Смит | 4200 |
Нека намерим имената на отделите, чиито суми от заплати на служителите са по-малко от 7000.
Решение:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Ето резултата:
отдел | сума |
---|---|
финанси | 6550 |
Дискусия:
За да филтрирате записи с помощта на агрегатната функция (функцията SUM от по-рано), използвайте клаузата HAVING. За да изчислите сумата от стойности за всяка група редове, използвайте функцията SUM за агрегиране. В тази заявка отделът с колони се изчислява със сумата от всички заплати на неговите служители като група (изчислете го с функцията SUM с колоната заплата като аргумент). Тъй като изчислявате стойността за всяка група редове (ние групираме редове според името на отдела), заявката има клауза GROUP BY с името на колоната за групиране на редове (в нашия пример, GROUP BY department
). Последната стъпка е използването на агрегатната функция в клаузата HAVING. Не забравяйте, че HAVING трябва да се постави след клауза GROUP BY. HAVING съдържа условието, сравняващо стойността, върната от агрегатната функция, с дадена стойност. От горе това са сумите на заплатите със стойност по-малка от 7000 (SUM(salary)<7000
). Тук проверяваме, че сумата на заплатата във всеки отдел е по-ниска от 7000. Заявката показва само един отдел, финанси, със заплати от 6550.