Having sql: HAVING | SQL | SQL-tutorial.ru

Содержание

HAVING (Transact-SQL) — SQL Server

  • Чтение занимает 2 мин

В этой статье

Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных

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

Синтаксические обозначения в Transact-SQL

Синтаксис

[ HAVING <search condition> ]  

Аргументы

<search_condition> задает один предикат или несколько, которые должны выполняться для групп или агрегатов. Дополнительные сведения об условиях поиска и предикатах см. в статье Условие поиска (Transact-SQL).

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

Примеры

В следующем примере, который использует простое предложение HAVING, из таблицы SalesOrderID извлекается сумма всех полей SalesOrderDetail, значение которых превышает $100000.00.

USE AdventureWorks2012 ;  
GO  
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal  
FROM Sales.SalesOrderDetail  
GROUP BY SalesOrderID  
HAVING SUM(LineTotal) > 100000.00  
ORDER BY SalesOrderID ;  

Примеры: Azure Synapse Analytics и Параллельное хранилище данных

В приведенном ниже примере предложение HAVING используется с целью получения общей суммы SalesAmount, превышающей 80000 для каждого

OrderDateKey из таблицы FactInternetSales.

-- Uses AdventureWorks  
  
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales   
FROM FactInternetSales  
GROUP BY OrderDateKey   
HAVING SUM(SalesAmount) > 80000  
ORDER BY OrderDateKey;  

См. также:

GROUP BY (Transact-SQL)
WHERE (Transact-SQL)

SQL HAVING — интересующие значения агрегатных функций

SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА HAVING АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) ОПЕРАТОР_СРАВНЕНИЯ ЗАДАННОЕ ЧИСЛО

Следует особо заметить, что оператор HAVING всегда находится в запросе после оператора GROUP BY.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

В первых примерах работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке.

В этой базе данных есть таблица Ads, содержащая данные об объявлениях, поданных за неделю. Столбец Category содержит данные о больших категориях объявлений (например, Недвижимость), а столбец Parts — о более мелких частях, входящих в категории (например, части Квартиры и Дачи являются частями категории Недвижимость). Столбец Units содержит данные о количестве поданных объявлений, а столбец Money — о денежных суммах, вырученных за подачу объявлений.

Пример 1. Используя операторы SQL HAVING и GROUP BY, определить категории, в которых за подачу объявлений выручено более 20000. Пишем следующий запрос:

SELECT Category, SUM(Money) AS Money FROM Ads GROUP BY Category HAVING SUM(Money)>20000

Результатом выполнения запроса будет следующая таблица:

CategoryMoney
Недвижимость40530
Транспорт38560

Пример 2. База данных и таблица — те же, что и в примере 1.

Используя операторы SQL HAVING и GROUP BY, требуется вывести категории, в какой-либо части которых минимальное количество поданных объявлений не превышает 100. Для этого пишем следующий запрос:

SELECT Category, Units, MIN(Units) AS Minimum FROM Ads GROUP BY Category HAVING MIN(Units)

Результатом будет следующая таблица:

CategoryPartMinimum
ДосугИгры41
НедвижимостьДома47
Стройматериалы
Доски
68

Пример 3. База данных и таблица — те же, что и в предыдущих примерах.

Используя операторы SQL HAVING и GROUP BY, требуется вывести категории объявлений, в которых более двух частей. Пишем следующий запрос:

SELECT Category, Part FROM Ads GROUP BY Category HAVING COUNT(*)>2

Результатом будет следующая таблица:

CategoryPart
ДосугКниги
ДосугМузыка
ДосугИгры
НедвижимостьКвартиры
НедвижимостьДачи
НедвижимостьДома

Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE,

DELETE и UNION.

Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения

Самостоятельно поработайте с таблицей Staff (штатные сотрудники) базы данных фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), Years (длительность трудового стажа) и Salary (размер заработной платы). Примеры для самостоятельного решения со ссылками для проверки решения — после таблицы.

NameDeptYearsSalary
Sanders20718357.5
Junkers15616232.8
Moonlight15821500.6
Pernal20818171.2
Aisen15719540.7
McGregor15715790.8
Marenghi38517506.8
Doctor205
12322.4
Factor38816228.7

Оператор SQL HAVING можно использовать для выборки данных, соответствующим результатам сравнения не только с заданным числом, но и со значением, возвращаемым квантором ALL или ANY (SOME). Квантор ALL возвращает из запроса, к которому он применяется, максимальное значение и тогда при помощи оператора HAVING происходит сравнение с максимальным значением. Например, ALL(10, 15, 20) вернёт 20. Квантор ANY (и его аналог SOME) возвращает минимальное значение и тогда при помощи оператора HAVING происходит сравнение с минимальным значением. Синтаксис запроса с оператором SQL HAVING, определяющий сравнение со значением, возвращаемым квантором ALL или ANY (SOME) выглядит следующим образом:.

SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА HAVING АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) ОПЕРАТОР_СРАВНЕНИЯ КВАНТОР (SELECT АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА)

Пример 7. Есть база данных «Театр». В ней есть таблица Play, содержащая данные о постановках в театре. В этой таблице есть поля PlayID (идентификатор), Name (название), Genre (жанр), Author (автор), Dir_ID (внешний ключ — идентификатор режиссёра), PremiereDate (дата премьеры), LastDate (дата окончания). Требуется определить самый популярный жанр театра, то есть жанр, в котором поставлено наибольшее количество постановок.

Используя операторы SQL HAVING и GROUP BY, пишем первую часть запроса к таблице Play, которая задаёт сравнение числа строк, сгруппированных по жанру:

SELECT Genre FROM Play GROUP BY Genre HAVING COUNT(*) >=

Теперь нужно определить, с чем сравнивать. Это максимальное число записей в той же таблице, сгруппированных по жанру. Поэтом нам понадобиться квантор ALL. Пишем вторую часть запроса:

ALL(SELECT COUNT(*) FROM PLAY GROUP BY Genre)

Весь запрос для определения самого популярного жанра в театре будет следующим:

SELECT Genre FROM Play GROUP BY Genre HAVING COUNT(*) >= ALL(SELECT COUNT(*) FROM PLAY GROUP BY Genre)

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

Пример 8. Продолжаем работать с базой данных «Театр». Нам понадобятся таблицы Play, содержащая данные о постановках в театре и Team, содержащая данные о ролях актёров. Требуется вывести список моноспектаклей (спектаклей с одним актёром). Ниже приведена схема базы данных «Театр» (для увеличения рисунка нажать на него левой кнопкой мыши).

Если ещё точнее, нам нужно выбрать спектакли, в которых лишь одна роль. Среди полей в таблице Team есть PlayID — внешний ключ, ссылающийся на таблицу Play. В каждой записи таблицы Team этот внешний ключ определяет постановку, в которой исполняется данная роль. Если мы соединим таблицы Play и Team по ключу PlayID, то мы сможем определить количество ролей в постановках. Так как мы соединяем две таблицы, а не больше, то для простоты можем использовать соединение без оператора JOIN, перечисляя таблицы через запятую, а для обозначения условия соединения используя слово WHERE.

C оператором HAVING используем агрегатную функцию COUNT — для подсчёта числа ролей в каждой постановке. Весь запрос для определения спектаклей с одной ролью, а следовательно, с одним актёром будет следующим:

SELECT Play.Name AS pname FROM Play, Team WHERE Team.PLAY_ID = Play.Play_ID GROUP BY Play.Name HAVING COUNT(Team.PLAY_ID) = 1 ORDER BY Play.Name

Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения

Пример 9. Продолжаем работать с базой данных «Театр». Вывести список актеров, которые в одном спектакле играют более одной роли, и количество их ролей.

Использовать оператор JOIN. Естественно, использовать HAVING, GROUP BY.

Правильное решение и ответ.

Поделиться с друзьями

Реляционные базы данных и язык SQL

MS SQL Server и T-SQL

Операторы GROUP BY и HAVING

Последнее обновление: 19.07.2017

Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:


SELECT столбцы
FROM таблица
[WHERE условие_фильтрации_строк]
[GROUP BY столбцы_для_группировки]
[HAVING условие_фильтрации_групп]
[ORDER BY столбцы_для_сортировки]

GROUP BY

Оператор GROUP BY определяет, как строки будут группироваться.

Например, сгруппируем товары по производителю


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer

Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.

Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.

И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products

Другой пример, добавим группировку по количеству товаров:


SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer, ProductCount

Оператор GROUP BY может выполнять группировку по множеству столбцов.

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

Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE, но до выражения ORDER BY:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price > 30000
GROUP BY Manufacturer
ORDER BY ModelsCount DESC

Фильтрация групп. HAVING

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

Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.

Например, найдем все группы товаров по производителям, для которых определено более 1 модели:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

При этом в одной команде мы можем использовать выражения WHERE и HAVING:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1

То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.

Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:


SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC

В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

Команда SELECT Раздел Раздел HAVING — Условия поиска на группу строк — HAVING COUNT и HAVING MIN

Раздел HAVING

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

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

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

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

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

HAVING COUNT

Выбрать коды товаров, покупаемых более чем одним покупателем:

SELECT stock FROM ordsale GROUP BY stock HAVING COUNT(*) > 1;

HAVING MIN

Получить значения минимального и максимального оклада для клерков каждого отдела, где  самое низкое жалованье составляет менее $1,000:

SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal)

Руководство по SQL. Элемент HAVING. – PROSELYTE

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

Запрос и использованием данного элемента имеет следующий вид:


SELECT колонка1, колонка2
FROM таблица1, таблица2
WHERE [ условия ]
GROUP BY колонка1, колонка2
HAVING [ условия ]
ORDER BY колонка1, колонка2


Пример:

Предположим, что у нас есть таблица developers, которая содержит следующие данные:


+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
+----+-------------------+-----------+------------+--------+


Теперь попробуем выполнить следующий запрос:


mysql> SELECT ID, NAME, SPECIALTY, SALARY 
FROM developers 
GROUP BY SPECIALTY 
HAVING COUNT(SPECIALTY) >= 2;


В результате выполнения данного запроса мы получим следующую таблицу:


+----+-------------------+-----------+--------+
| ID | NAME              | SPECIALTY | SALARY |
+----+-------------------+-----------+--------+
|  4 | Konstantin Geiko  | C#        |   2000 |
|  1 | Eugene Suleimanov | Java      |   2500 |
|  5 | Asya Suleimanova  | UI/UX     |   1800 |
+----+-------------------+-----------+--------+


На этом мы заканчиваем изучение элемента HAVING.
В следующей статье мы рассмотрим транзакции.

Использование условия Having SQL для фильтрации и группировки результатов: примеры и синтаксис

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

Синтаксис

В следующем блоке кода показано использование условия HAVING в запросе.

SELECT FROM WHERE GROUP BY HAVING ORDER BY

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

Условие HAVING должно указываться в запросе после условия GROUP BY и перед условием ORDER BY, если оно используется. В следующем блоке кода показан синтаксис запроса SELECT, включающего условие HAVING:

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2

SELECT column1, column2

FROM table1, table2

WHERE [ conditions ]

GROUP BY column1, column2

HAVING [ conditions ]

ORDER BY column1, column2

Пример

Рассмотрим таблицу CUSTOMERS, содержащую следующие записи.

Ниже приведен пример, в котором будут отображаться записи с возрастом соответствующим условию больше или равно 2.

SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS GROUP BY age HAVING COUNT(age) >= 2;

SELECT ID, NAME, AGE, ADDRESS, SALARY

FROM CUSTOMERS

GROUP BY age

HAVING COUNT(age) >= 2;

В результате мы получим следующее:

Источник: //www.tutorialspoint.com/

Редакция: Команда webformyself.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Хотите изучить MySQL?

Посмотрите курс по базе данных MySQL!

Смотреть

Предложение SQL HAVING. Язык запросов SQL

Язык запросов SQL. DML.

Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальные суммы приобретений, значения которых выше 90000. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный ниже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему:

SELECT BNum, MAX(SSum)
FROM Sells
WHERE MAX(SSum)>90000
GROUP BY BNum

Это будет отклонением от правил SQL. Чтобы увидеть максимальную стоимость приобретений свыше 90000, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые для удаления определенных групп из вывода после группировки точно также, как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:

SELECT BNum, MAX(SSum)
FROM Sells
GROUP BY BNum
HAVING MAX(SSum)>90000
Bnum MAX OF SSum
2 192000
1 100000

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

SELECT BNum, SDate, MAX(SSum)
FROM Sells
GROUP BY BNum, SDate
HAVING SDate="17.02.01"

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

SELECT BNum, MAX(SSum)
FROM Sells
WHERE SDate="17.02.01"
GROUP BY BNum

SQL ИМЕЕТ | МАКС — Завод

ГРУППА SQL ПО ОБЪЯСНЕНИЮ

HAVING похож на WHERE, но работает с сгруппированными записями.

HAVING требует наличия предложения GROUP BY.

Будет возвращено

групп, соответствующих критериям HAVING.

WHERE и HAVING могут использоваться в одном запросе.

HAVING используются с агрегатами: COUNT, SUM и т. Д.

Задача: Перечислите все страны с более чем 2 поставщиками.

скопировано в буфер обмена

 ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ поставщика
 ГРУППА ПО СТРАНАМ
ИМЕЕТ СЧЕТ (Id)> 2
 
  ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ поставщика
 ГРУППА ПО СТРАНАМ
ИМЕЕТ СЧЕТ (Id)> 2
  
Попробуйте вживую

HAVING синтаксис.

ВЫБЕРИТЕ имена столбцов
  ОТ имя-таблицы
 ГДЕ условие
 ГРУППА ПО именам столбцов
ИМЕЮЩИЕ условие
 

HAVING синтаксис с ORDER BY.

ВЫБЕРИТЕ имена столбцов
  ОТ имя-таблицы
 ГДЕ условие
 ГРУППА ПО именам столбцов
ИМЕЮЩИЕ условие
 ЗАКАЗАТЬ ПО именам столбцов
 

SQL ИМЕЕТ СЧЁТ

КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Задача: Укажите количество клиентов в каждой стране.
Включите только страны с более чем 10 клиентами.

скопировано в буфер обмена

 ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ Заказчика
 ГРУППА ПО СТРАНАМ
ИМЕЕТ СЧЕТ (Id)> 10
 
  ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ Заказчика
 ГРУППА ПО СТРАНАМ
ИМЕЕТ COUNT (Id)> 10
  
Попробуйте вживую

Результат: 3 записи

Страна Счетчик
Франция 11
Германия 11
США 13

SQL ИМЕЕТ, ЗАКАЗАТЬ

КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Задача: Укажите количество клиентов в каждой стране, кроме США, отсортированных по убыванию.Включите только страны с 9 или более клиентами.

скопировано в буфер обмена

 ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ Заказчика
 ГДЕ Страна <> 'США'
 ГРУППА ПО СТРАНАМ
HAVING COUNT (Id)> = 9
 ORDER BY COUNT (Id) DESC
 
  ВЫБРАТЬ страну, COUNT (Id) AS Count
  ОТ Заказчика
 ГДЕ Страна <> 'США'
 ГРУППА ПО СТРАНАМ
HAVING COUNT (Id)> = 9
 ORDER BY COUNT (Id) DESC
  
Попробуйте вживую

Результат: 3 записи

Страна Счетчик
Франция 11
Германия 11
Бразилия 9

SQL ИМЕЕТ СРЕДНИЙ МЕЖДУ

ЗАКАЗ
Id
OrderDate
OrderNumber
CustomerId
TotalAmount
Фамилия
CUSTOMER
Id
Город
Страна
Телефон

Задача: Перечислите всех клиентов со средним объемом заказов от 1000 до 1200 долларов.

скопировано в буфер обмена

 SELECT FirstName, LastName, AVG (TotalAmount) AS Среднее
  ОТ [Заказ] O
  ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id
 ГРУППА ПО ФАМИЛИ И ИМЕНИ
ИМЕЕТ СРЕДНЕЕ (TotalAmount) МЕЖДУ 1000 И 1200
 
  SELECT FirstName, LastName, AVG (TotalAmount) AS Среднее
  ОТ [Заказ] O
  ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id
 ГРУППА ПО ФАМИЛИ И ИМЕНИ
ИМЕЕТ СРЕДНЕЕ (TotalAmount) МЕЖДУ 1000 И 1200
  
Попробуйте вживую

Результат: 10 записей

Имя Фамилия Среднее значение
Мигель Анхель Паолино 1081.215000
Изабель де Кастро 1063.420000
Александр Feuer 1008.440000
Томас Харди 1062.038461
Pirkko Коскитало 1107.806666
Janete Лимейра 1174.945454
Антонио Морено 1073.621428
Рита Мюллер 1065.385000
Хосе Педро Фрейре 1183.010000
Карин Шмитт 1057.386666

HAVING (Transact-SQL) — SQL Server

  • 2 минуты на чтение

В этой статье

Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

  [ИМЕЕТ <условие поиска>]
  

Аргументы

<условие_поиска> Задает один или несколько предикатов, которым должны соответствовать группы и / или агрегаты. Дополнительные сведения об условиях поиска и предикатах см. В разделе Условия поиска (Transact-SQL).

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

Примеры

В следующем примере, в котором используется простое предложение HAVING , извлекается сумма для каждого SalesOrderID из таблицы SalesOrderDetail , которая превышает $ 100000.00 .

  ИСПОЛЬЗОВАТЬ AdventureWorks2012;
ИДТИ
ВЫБЕРИТЕ SalesOrderID, SUM (LineTotal) AS SubTotal
ОТ Sales.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЮЩАЯ СУММ (LineTotal)> 100000.00
ЗАКАЗ ПО SalesOrderID;
  

Примеры: Azure Synapse Analytics и хранилище параллельных данных

В следующем примере предложение HAVING используется для получения общего SalesAmount , которое превышает 80000 для каждого OrderDateKey из таблицы FactInternetSales .

  - Использует AdventureWorks
  
ВЫБЕРИТЕ OrderDateKey, СУММ (SalesAmount) как TotalSales
ОТ ФАКТАИнтернетПродажи
ГРУППА ПО OrderDateKey
ИМЕЮЩАЯ СУММ (SalesAmount)> 80000
ЗАКАЗАТЬ ПО OrderDateKey;
  

См. Также

ГРУППА ПО (Transact-SQL)
ГДЕ (Transact-SQL)

SQL Server HAVING Clause

Summary : в этом руководстве вы узнаете, как использовать предложение SQL Server HAVING для фильтрации групп на основе заданных условий.

Введение в SQL Server

Предложение HAVING

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

 

SELECT select_list ИЗ table_name ГРУППА ПО group_list ИМЕЮЩИЕ условия;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе предложение GROUP BY объединяет строки в группы, а предложение HAVING применяет к этим группам одно или несколько условий.В результат включаются только группы, в которых условия оцениваются как ИСТИНА . Другими словами, группы, для которых условие оценивается как ЛОЖЬ, или НЕИЗВЕСТНО, , отфильтровываются.

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

 

SELECT column_name1, column_name2, агрегатная_функция (имя_столбца3) псевдоним_столбца ИЗ table_name ГРУППА ПО column_name1, column_name2 ИМЕЮЩИЕ алиас_столбца> значение;

Язык кода: SQL (язык структурированных запросов) (sql)

Вместо этого вы должны явно использовать выражение агрегатной функции в предложении HAVING следующим образом:

 

SELECT column_name1, column_name2, aggregate_function (column_name3) псевдоним ИЗ table_name ГРУППА ПО column_name1, column_name2 ИМЕЮЩИЕ агрегатная_функция (имя_столбца3)> значение;

Язык кода: SQL (язык структурированных запросов) (sql)

SQL Server

ИМЕЕТ примеров

Давайте рассмотрим несколько примеров, чтобы понять, как работает предложение HAVING .

SQL Server

HAVING с функцией COUNT , пример

См. Следующую таблицу заказов из образца базы данных:

В следующем операторе используется предложение HAVING для поиска клиентов, разместивших не менее двух заказов на каждую. год:

 

ВЫБРАТЬ Пользовательский ИД, ГОД (дата_заказа), COUNT (order_id) order_count ИЗ заказы на продажу ГРУППА ПО Пользовательский ИД, ГОД (заказ_дата) ИМЕЮЩИЕ COUNT (order_id)> = 2 СОРТИРОВАТЬ ПО Пользовательский ИД;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом примере:

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

SQL Server

ИМЕЕТ предложение с функцией SUM () , пример

Рассмотрим следующую таблицу order_items :

Следующий оператор находит заказы на продажу, чистая стоимость которых превышает 20 000:

 

SELECT номер заказа, СУММ ( количество * list_price * (1 - скидка) ) чистая стоимость ИЗ продажи.order_items ГРУППА ПО номер заказа ИМЕЮЩИЕ СУММ ( количество * list_price * (1 - скидка) )> 20000 СОРТИРОВАТЬ ПО чистая стоимость;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом примере:

  • Во-первых, функция СУММ () возвращает чистые значения заказов на продажу.
  • Во-вторых, предложение HAVING фильтрует заказы на продажу, чистая стоимость которых меньше или равна 20 000.

SQL Server

ИМЕЕТ предложение с функциями MAX и MIN , пример

См. Следующую таблицу продуктов :

Следующий оператор сначала находит максимальные и минимальные цены по прейскуранту в каждой категории продуктов.Затем он отфильтровывает категорию, у которой максимальная прейскурантная цена больше 4000 или минимальная прейскурантная цена меньше 500:

 

SELECT category_id, MAX (list_price) max_list_price, MIN (list_price) min_list_price ИЗ production.products ГРУППА ПО category_id ИМЕЮЩИЕ MAX (list_price)> 4000 ИЛИ MIN (list_price) <500;

Язык кода: SQL (язык структурированных запросов) (sql)

SQL Server

HAVING clause with AVG () function example

Следующая инструкция находит категории продуктов, средняя цена по прейскуранту которых составляет от 500 до 1000:

 

ВЫБРАТЬ category_id, AVG (list_price) avg_list_price ИЗ производство.товары ГРУППА ПО category_id ИМЕЮЩИЕ СРЕДНЕЕ (list_price) МЕЖДУ 500 И 1000;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом руководстве вы узнали, как использовать предложение SQL Server HAVING для фильтрации групп на основе заданных условий.

SQL GROUP BY и предложение HAVING с примерами

Что такое SQL Group by Clause?

Предложение GROUP BY - это команда SQL, которая используется для группировки строк с одинаковыми значениями .Предложение GROUP BY используется в операторе SELECT. При желании он используется вместе с агрегатными функциями для создания сводных отчетов из базы данных.

Вот что он делает, суммирует данные из базы данных.

Запросы, содержащие предложение GROUP BY, называются сгруппированными запросами и возвращают только одну строку для каждого сгруппированного элемента.

Синтаксис SQL GROUP BY

Теперь, когда мы знаем, что такое предложение SQL GROUP BY, давайте посмотрим на синтаксис для базовой группы по запросу.

 Операторы SELECT ... GROUP BY имя_столбца1 [, имя_столбца2, ...] [условие HAVING]; 

ЗДЕСЬ

  • «Операторы SELECT ...» - это стандартный запрос команды SQL SELECT.
  • « GROUP BY имя_столбца1 » - это предложение, которое выполняет группировку на основе имя_столбца1.
  • «[, имя_столбца2, ...]» не является обязательным; представляет имена других столбцов, когда группировка выполняется более чем по одному столбцу.
  • «[HAVING condition]» не является обязательным; он используется для ограничения строк, затронутых предложением GROUP BY.Это похоже на предложение WHERE.

Группирование с использованием одного столбца

Чтобы помочь понять эффект предложения SQL Group By, давайте выполним простой запрос, который возвращает все записи пола из таблицы members.

 ВЫБЕРИТЕ `пол` ИЗ` members`; 
 
пол
Женский
Женский
Мужской
Женский
Мужской
Мужской
Мужской
Мужской
Мужской

Предположим, мы хотим получить уникальные значения для полов.Мы можем использовать следующий запрос -

 SELECT `пол` ИЗ` members` GROUP BY `пол`; 

Выполнение вышеуказанного сценария в рабочей среде MySQL для Myflixdb дает следующие результаты.

 

Обратите внимание, что было возвращено только два результата. Это потому, что у нас есть только два гендерных типа - Мужской и Женский. Предложение GROUP BY в SQL сгруппировало все «мужские» члены вместе и вернуло для него только одну строку. То же самое и с участницами «Женского».

Группирование с использованием

нескольких столбцов

Предположим, мы хотим получить список фильмов category_id и соответствующие годы, в которые они были выпущены.

Давайте посмотрим на результат этого простого запроса

 SELECT `category_id`,` year_released` FROM `movies`; 
 
category_id year_released
1 2011
2 2008
NULL 2008
NULL 2010
8 2007 900
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

Приведенный выше результат имеет много дубликатов.

Давайте выполним тот же запрос, используя group by в SQL -

 SELECT `category_id`,` year_released` FROM `movies` GROUP BY` category_id`, `year_released`; 

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

  900 
category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

Пункт GROUP BY действует на как идентификатор категории, так и год выпуска для идентификации уникальных строк в нашем примере выше.

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

Группирующие и

агрегатные функции

Предположим, нам нужно общее количество мужчин и женщин в нашей базе данных. Для этого мы можем использовать следующий сценарий, показанный ниже.

 ВЫБЕРИТЕ `пол`, COUNT (` членство_число`) ИЗ `members` GROUP BY` пол`; 

Выполнение вышеуказанного сценария в рабочей среде MySQL для myflixdb дает следующие результаты.

 
пол COUNT ('members_number')
Женский 3
Мужской 5

Результаты, показанные ниже, сгруппированы по каждому уникальному значению пола и количеству сгруппированных количество строк подсчитывается с использованием агрегатной функции COUNT.

Ограничение результатов запроса с помощью предложения

HAVING

Не всегда нам нужно выполнять группировку всех данных в данной таблице.Бывают моменты, когда мы захотим ограничить наши результаты определенными критериями. В таких случаях мы можем использовать предложение HAVING

Предположим, мы хотим знать все годы выпуска для категории фильмов с идентификатором 8. Для достижения наших результатов мы будем использовать следующий сценарий.

 ВЫБРАТЬ * ИЗ `movies` ГРУППА ПО` category_id`, `year_released` HAVING` category_id` = 8; 

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

 
movie_id title Director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL NULL 2007 8

Обратите внимание, что предложение GROUP BY затронуло только фильмы с идентификатором категории 8.

Сводка

  • SQL-запрос GROUP BY используется для группировки строк с одинаковыми значениями.
  • Предложение GROUP BY используется вместе с оператором SQL SELECT.
  • Оператор SELECT, используемый в предложении GROUP BY, может использоваться только в том случае, если он содержит имена столбцов, агрегатные функции, константы и выражения.
  • Предложение SQL Have используется для ограничения результатов, возвращаемых предложением GROUP BY.
  • Предложение MYSQL GROUP BY используется для сбора данных из нескольких записей и возвращаемых записей, содержащихся в одном или нескольких столбцах.

SQL COUNT () с HAVING - w3resource

COUNT () с HAVING

Предложение HAVING с функцией SQL COUNT () может использоваться для установки условия с помощью оператора select.Предложение HAVING используется вместо предложения WHERE с функцией SQL COUNT ().

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

Пример :

Получить данные о количестве агентов из таблицы «агенты» с условием -

1. количество агентов должно быть больше 3,

можно использовать следующий оператор SQL:

  ВЫБРАТЬ СЧЕТЧИК (*)
ОТ агентов
ИМЕЕТ СЧЕТ (*)> 3;  

Пример таблицы: агенты

Выход:

 СЧЕТЧИК (*)
----------
        12
 

Изображение для презентации:


SQL COUNT () с использованием и группировкой по

Пример таблицы: агенты

Получить данные о «комиссии» и количестве агентов для этой комиссии из таблицы «агенты» при следующих условиях -

1.количество агентов для конкретного «комиссона»,

2. количество агентов для данной «комиссии» должно быть более 3,

можно использовать следующий оператор SQL:

  ВЫБРАТЬ комиссию, СЧЁТ (*)
ОТ агентов
ГРУППА ПО комиссии
ИМЕЕТ СЧЕТ (*)> 3;
  

Выход:

 КОМИССИОННЫЙ СЧЕТ (*)
---------- ----------
       .15 4
 

Примечание: выходные данные указанного оператора SQL, показанного здесь, получены с помощью Oracle Database 10g Express Edition.

Вот слайд-презентация всех агрегатных функций.

Практические упражнения SQL

Хотите улучшить статью выше? Публикуйте свои заметки / комментарии / примеры через Disqus.

Назад: СЧЁТ с группировкой по
Далее: Функция СУММ

GROUP BY и предложение HAVING в SQL

Важный компонент для аналитика, позволяющий суммировать такие данные, как продажи, прибыль, затраты и зарплата.Обобщение данных очень помогает аналитику создавать визуализацию, делать выводы и писать отчеты. В SQL предложение GROUP BY является одним из инструментов для суммирования или агрегирования рядов данных. Например, суммируйте ежедневные продажи, объедините их в один квартал и покажите их высшему руководству. Точно так же, если вы хотите посчитать, сколько сотрудников в каждом отделе компании. Он группирует базы данных на основе одного или нескольких столбцов и объединяет результаты.

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

В этом руководстве вы подробно изучите предложение GROUP BY с соответствующими примерами. Вот список тем, которые вы изучите в этом руководстве:

  • Группировать по статье
  • Оговорка
  • Агрегатные функции
  • Сравните предложение Have и Where в SQL
  • GROUP BY с примером JOIN
  • GROUP BY Сравнение с другим пунктом
  • Практическое задание
  • Заключение

Группировать по пункту

Предложение GROUP BY используется в SQL с оператором SELECT для организации похожих данных в группы.Он объединяет несколько записей в один или несколько столбцов, используя некоторые функции. Как правило, эти функции являются агрегатными функциями, такими как min (), max (), avg (), count () и sum (), для объединения в один или несколько столбцов. Он использует стратегию «разделить-применить-объединить» для анализа данных.

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

Что следует помнить:

  • Предложение GROUP BY используется с оператором SELECT.
  • GROUP BY объединяет результаты на основе выбранного столбца: COUNT, MAX, MIN, SUM, AVG и т. Д.
  • GROUP BY возвращает только один результат для каждой группы данных.
  • Предложение
  • GROUP BY всегда следует за предложением WHERE.
  • Предложение GROUP BY всегда предшествует предложению ORDER BY (http: // slideplayer.com / slide / 15440670 /).

В приведенном выше примере таблица сгруппирована на основе столбца DeptID, а зарплата агрегирована по отделам.

Статья

, имеющая

Предложение HAVING используется в SQL как условное предложение с предложением GROUP BY. Это условное предложение возвращает строки, в которых результаты агрегатной функции совпадают только с заданными условиями. Он добавлен в SQL, потому что предложение WHERE нельзя комбинировать с агрегированными результатами, поэтому оно имеет другое назначение. Основная цель предложения WHERE - иметь дело с неагрегированными или отдельными записями.

  • Предложение HAVING всегда используется в сочетании с предложением GROUP BY.
  • Предложение
  • HAVING ограничивает данные для групповых записей, а не для отдельных записей.
  • WHERE и HAVING можно использовать в одном запросе.

В приведенном выше примере таблица сгруппирована на основе столбца DeptID, и эти сгруппированные строки отфильтрованы с использованием предложения HAVING с условием AVG (Salary)> 3000.

Агрегатные функции

Агрегатные функции, используемые для объединения результата группы в один, например COUNT, MAX, MIN, AVG, SUM, STDDEV и VARIANCE.Эти функции также известны как многострочные функции.

  • SUM () : возвращает сумму или итог каждой группы.
  • COUNT () : возвращает количество строк в каждой группе.
  • AVG () : возвращает среднее и среднее значение для каждой группы.
  • MIN () : возвращает минимальное значение для каждой группы.
  • MAX () : возвращает минимальное значение каждой группы.

Сравните предложение Have и Where в SQL

  • В некоторых случаях вам нужно отфильтровать отдельные записи.В таких случаях вы можете использовать предложение WHERE, тогда как в других случаях вам нужно отфильтровать группы с определенным условием. В таких случаях вы можете использовать предложение HAVING.
  • Предложение
  • WHERE фильтрует кортеж записей по кортежу, а предложение HAVING фильтрует всю группу.
  • Запрос может содержать оба предложения (предложение WHERE и HAVING).
  • Сначала применяется пункт «Где», а затем пункт «Наличие».
  • Предложение
  • WHERE ограничивает записи до предложения GROUP BY, тогда как предложение HAVING ограничивает группы после выполнения предложения GROUP BY.
  • Предложение
  • WHERE можно использовать с операторами SELECT, UPDATE, DELETE и INSERT, тогда как HAVING можно использовать только с оператором SELECT.
Источник изображения

GROUP BY с примером JOIN

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

В приведенном выше примере сотрудник и отдел объединены с помощью общего столбца DeptID.

В приведенном выше примере оба предложения JOIN и GROUP BY используются вместе в одном запросе. После объединения обеих таблиц (Сотрудник и Отдел) объединенная таблица сгруппирована по названию Отдела.

GROUP BY в сравнении с другим пунктом

Сравнить GROUP BY и DISTINCT

DISTINCT возвращает уникальные значения, представленные в столбце, в то время как GROUP BY возвращает уникальные / отдельные элементы с агрегированным результирующим столбцом. В следующем примере вы можете увидеть значения DISTINCT в таблице dept .

Сравнить GROUP BY и ORDER BY

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

Практическое задание

Название стола: Книги

Столбцы: ISBN, название, дата публикации, цена, издатель

Напишите SQL-запросы для следующих операторов и поделитесь своими ответами в комментариях:

  1. Определите, сколько книг находится в каждой категории.
  2. Определите, сколько книг находится в категории «Управление».
  3. Определите среднюю балансовую стоимость каждой категории.
  4. Укажите цену самой дешевой книги в каждой категории.

Источник: Это задание основано на книге Джона Кастила «Oracle 11g SQL».

Заключение

Поздравляем, вы дошли до конца этого урока!

В этом руководстве вы рассмотрели много деталей о предложениях GROUP BY и HAVING.Вы узнали, что такое предложение GROUP BY и HAVING, на примерах, сравнение между предложениями HAVING и WHERE в SQL, GROUP BY с JOIN и сравнение GROUP BY с DISTINCT и ORDER BY. В последнем разделе у вас есть практическое задание для оценки ваших знаний.

Надеюсь, теперь вы можете использовать концепцию GROUP BY и HAVING Clause для анализа собственных наборов данных. Спасибо, что прочитали это руководство!

Если вы хотите узнать больше о SQL, воспользуйтесь промежуточным SQL DataCamp. курс.

Предложение SQL HAVING с примерами

Резюме : в этом руководстве вы узнаете, как использовать предложение SQL HAVING , чтобы указать условие поиска для группы строк или агрегата.

Введение в предложение HAVING в SQL

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

 

SELECT столбец1, столбец2, агрегатная функция (выражение) ИЗ Таблица ГРУППА ПО столбцу 1 ИМЕЮЩИЕ состояние;

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

Давайте рассмотрим несколько примеров использования предложения HAVING.

SQL HAVING examples

Давайте взглянем на таблицу orderdetails :

SQL HAVING with SUM function example

В этом примере мы найдем заказы на продажу, общая сумма продаж которых превышает 12000 долларов.Мы используем предложение HAVING с предложением GROUP BY , чтобы выполнить это как следующий запрос:

 

SELECT заказ, СУММ (unitPrice * количество) Итого ИЗ Информация для заказа ГРУППА ПО заказу ИМЕЕТ всего> 12000;

Как работает запрос.

  • Сначала для каждой позиции строки заказа SQL вычисляет общую сумму с помощью функции СУММ. (Псевдоним столбца Total используется для форматирования вывода).
  • Во-вторых, предложение GROUP BY группирует выбранные строки по OrderID .Для каждого заказа, в котором у нас есть только одна группа, содержащая OrderID и Total
  • В-третьих, предложение HAVING получает группы, у которых Total больше 12000 .

Пример функции SQL HAVING с COUNT

Следующий запрос выбирает все заказы, в которых есть не менее 5 позиций. Мы используем функцию COUNT с предложениями HAVING и GROUP BY .

 

ВЫБРАТЬ orderID, COUNT (productID) товаров ИЗ Информация для заказа ГРУППА ПО ИД ЗАКАЗА ИМЕЮЩИЕ продукты> 5;

Предложение SQL HAVING с примерами функций MAX и MIN

Взгляните на приведенную ниже таблицу продуктов :

Чтобы выбрать самый дорогой продукт в каждой категории, используйте следующий запрос:

 

ВЫБРАТЬ categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО идентификатору категории;

Обратите внимание, что в предложении WHERE оператора используется подзапрос для получения правильного продукта во внешнем запросе. Для каждой категории, чтобы выбрать самый дорогой продукт, цена которого превышает 100 долларов, мы можем использовать функцию MAX в предложении HAVING следующим образом:

 

SELECT categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО идентификатору категории ИМЕЮЩИЙ МАКС (цена за единицу)> 100;

Обратите внимание, что выбрана только цена за единицу продукта в целом, превышающую 50 долларов США.

Чтобы выбрать наименее дорогой продукт в каждой категории, мы используем тот же метод, что и самый дорогой продукт в каждой категории, за исключением того, что функция MIN используется вместо функции MAX :

SELECT categoryID, productID, productName, MIN (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МИН (цена за единицу) ИЗ продукты B КУДА Б.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *