Секция having (фильтрует группы)
Секция having похожа на where, однако она может использоваться только в сочетании с секцией group by.
В секции having должны использоваться только те столбцы, которые присутствуют в списке выборки, но по этим столбцам можно формировать любые агрегатные функции, в том числе и отсутствующие в списке выборки.
Следующий пример демонстрирует применение секции having:
SELECT [Дата], SUM([Стоимость_продажи])
FROM [Продажи]
GROUP BY [Дата]
HAVING SUM([Стоимость_продажи]) > 10000
Пример возвращает сумму продаж, сгруппированную по дате, но только для тех дат, в которые сумма продаж была больше 10000.
Главное отличие между секциями having и where заключается в моменте их выполнения: секция where выполняется во время построения результата, а секция having - после того, как будет создан промежуточный набор.
Вот почему агрегатные функции могут использоваться в секции having, но не в секции where.
Секция compute
Секция compute позволяет включить в итоговый набор запроса основные и сводные данные.
compute выполняет агрегатные функции для подведения как общих, так и промежуточных итогов.
В секции compute нельзя использовать псевдонимы столбцов.
Пример использования:
SELECT ID_клиента, Дата, Стоимость_продажи
FROM Продажи
ORDER BY Дата
COMPUTE SUM(Стоимость_продажи)
Этот запрос сначала возвращает все данные о продажах, отсортированные по дате, а потом создает итоговую строку - общую стоимость всех продаж.
Для группировки итоговых вычислений по столбцам можно использовать compute by, при этом все столбцы из этого списка должны присутствовать в секции order by в том же порядке.
Столбцы нельзя пропускать, но не обязательно использовать все столбцы из секции order by.
Например, если в список секции ORDER BY входят столбцы Фамилия, Имя и ID, то секция COMPUTE BY может содержать либо Фамилия, либо Фамилия и Имя, или Фамилия, Имя и ID.
Пример:
SELECT ID_клиента, Дата, Стоимость_продажи
FROM Продажи
ORDER BY ID_клиента, Дата
COMPUTE SUM(Стоимость_продажи) BY ID_клиента
Здесь итоговая сумма группируется по ID_клиента.
Выражения в секциях compute и compute by должны полностью совпадать с выражениями списка выборки.
Например, если в compute используется выражение (Стоимость_продажи * 0,12), оно также должно присутствовать в выражении select.
Следующий фрагмент демонстрирует применение секции compute:
SELECT Товар, SUM(Стоимость_продажи)
FROM Продажи
GROUP BY Товар
COMPUTE AVG ( SUM (Стоимость_продажи) )
Команда возвращает Товар и SUM(Стоимость_продажи) для значений Товар в таблице Продажи.
Кроме того, она создает завершающую запись, которая содержит среднее арифметическое всех сумм Стоимость_продаж.
Может показаться, что вы используете агрегатную функцию для агрегатной функции, что обычно не разрешается.
