Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 2- Введение в язык запросов SQL.docx
Скачиваний:
11
Добавлен:
14.11.2019
Размер:
89 Кб
Скачать
☆

Секция 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(Стоимость_продажи) для значений Товар в таблице Продажи.

Кроме того, она создает завершающую запись, которая содержит среднее арифметическое всех сумм Стоимость_продаж.

Может показаться, что вы используете агрегатную функцию для агрегатной функции, что обычно не разрешается.