Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Запрос без GROUP BY




SELECT R2.Оценка, R2.Дисциплина

FROM R1, R2

WHERE R1.ФИО = R2.ФИО

Результат:

Пример:

SELECT R2.Оценка, R2.Дисциплина, COUNT(*)As Qnt, Avg(Оценка) AS Ball

FROM R1, R2

WHERE R1.ФИО = R2.ФИО AND R2.Оценка IS NOT NULL

AND R2.Оценка >2

GROUP BY R2.Оценка, R2.Дисциплина

Результат:

Предложение HAVING (условия обработки сформированных групп)

Определяет условие поиска для группы.

Предложение HAVING определяет критерии, используемые, чтобы удалять определенные группы из вывода, точно так же как предложение WHERE делает это для индивидуальных строк.

 

Предложение HAVING обычно используется в предложении GROUP BY.

Синтаксис

[ HAVING <search condition> ]

Аргументы

<search_condition> - определяет условие поиска, которому должна соответствовать группа или статистическое выражение.

Типы данных text, image и ntext нельзя использовать в предложении HAVING.

 

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

В арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY.

Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк.

Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.

Пример (запрос, который выводит группы, в которых по одной дисциплине на экзаменах получено больше одной двойки):

 

SELECT R2.Дисциплина, R2.Оценка

FROM R1, R2

WHERE R1.ФИО = R2.ФИО AND

R2.Оценка = 2

GROUP BY R2.Оценка, R2.Дисциплина

HAVING count(*)> 1

Результат:

Пример (найти суммарные остатки на счетах в филиалах, которые превышают $5000).

 

SELECT Филиал, SUM(Остаток)

FROM F

GROUP BY Филиал

HAVING SUM(Остаток) > 5000

 

Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода.

 

Следующий запрос неправильный:

SELECT Филиал, SUM(Остаток)

FROM F

GROUP BY Филиал

HAVING ДатаОткрытия = 27/12/1999;

 

Поле ДатаОткрытия не может быть использовано в предложении HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля, выбранные GROUP BY.

Правильный способ приведенного запроса:

SELECT Филиал, SUM(Остаток) FROM F

WHERE ДатаОткрытия = '27/12/1999' GROUP BY Филиал;

Смысл данного запроса: найти сумму остатков по каждому филиалу счетов, открытых 27 декабря 1999 года.

 

HAVING может использовать только аргументы, которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции — наиболее общие, но и поля, выбранные с помощью GROUP BY, также допустимы.

 

 

Пример (суммарные остатки на счетах филиалов в Санкт-Петербурге, Пскове и Москве):

SELECT Филиал, SUM(Остаток)

FROM F,Q

WHERE F.Филиал = Q.Филиал

GROUP BY Филиал

HAVING Филиал IN ("Санкт-Петербург", "Псков", "Москва");

Напоминание: В арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY (в примере – Филиал).

Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк.

 

Пример (в результате его выполнения сначала удаляются строки, соответствующие продуктам с ценами выше $25, далее из групп удаляются продукты со средним объемам заказов ниже 5, а затем выводятся группы).

USE AdventureWorks;

GO

SELECT ProductID

FROM Sales.SalesOrderDetail

WHERE UnitPrice < 25.00

GROUP BY ProductID

HAVING AVG(OrderQty) > 5;

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...