При помощи HAVING отражаются все предварительно сгруппированные посредством GROUP BY блоки данных, удовлетворяющие заданным в HAVING условиям. Это дополнительная возможность "профильтровать" выходной набор.
Условия в HAVING отличаются от условий в WHERE:
- HAVING исключает из результирующего набора данных группы с результатами агрегированных значений;
- WHERE исключает из расчета агрегатных значений по группировке записи, не удовлетворяющие условию;
- в условии поиска WHERE нельзя задавать агрегатные функции.
Пример 33. Определить фирмы, у которых общее количество сделок превысило три.
SELECT Клиент.Фирма, Count(Сделка.Количество)
AS Количество_сделок
FROM Клиент INNER JOIN Сделка
ON Клиент.КодКлиента=Сделка.КодКлиента
GROUP BY Клиент.Фирма
HAVING Count(Сделка.Количество)>3
Пример 34.Вывести список товаров, проданных на сумму более 10000 руб.
SELECT Товар.Название,
Sum(Товар.Цена*Сделка.Количество)
AS Стоимость
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара
GROUP BY Товар.Название
HAVING Sum(Товар.Цена*Сделка.Количество)>10000
Пример 35. Вывести список товаров, проданных на сумму более 10000 без указания суммы.
SELECT Товар.Название
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара
GROUP BY Товар.Название
HAVING Sum(Товар.Цена*Сделка.Количество)>10000