Запрос без 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;
Читайте также: DISTINCT с подзапросами Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|