Sql group by having by: HAVING (Transact-SQL) — SQL Server
Содержание
HAVING (Transact-SQL) — SQL Server
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
-
Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)
Определяет условие поиска для группы или статистического выражения. Предложение HAVING можно использовать только в инструкции SELECT. HAVING обычно используется с предложением GROUP BY. Если предложение GROUP BY не используется, имеется одна неявная агрегированная группа.
Соглашения о синтаксисе Transact-SQL
Синтаксис
[ HAVING <search condition> ]
Примечание
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
<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 и Система платформы аналитики (PDW)
В приведенном ниже примере предложение 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)
Фильтрация групп (предложение HAVING)
Об
объекте
Учебные
материалы
Правила
описания синтаксиса команд SQL
Выборка
данных
Сортировка
выбранных данных
Фильтрация
данных (предложение WHERE)
Создание
вычисляемых полей
Агрегирующие
функции
Итоговые
данные (предложение GROUP BY)
Группировка
по нескольким столбцам
Нулевые
значения
Использование
предложения WHERE
Фильтрация
групп (предложение HAVING)
Объединение
таблиц
Подзапросы
Комбинированные
запросы
Вопросы
для самопроверки
Практические
задания
Список
литературы
Приложение
Фильтрация групп (предложение HAVING)
В
дополнение к способности
группировать данные с помощью предложения GROUP BY, SQL также позволяет
осуществлять фильтрацию — указывать, какие группы должны быть
включены в
результат, а какие исключены из него. Задать условия для групп можно с
помощью
предложения HAVING.
В самом общем смысле, предложение
HAVING работает аналогично предложению WHERE, но применяется к группам.
WHERE накладывает
ограничения на строки, a HAVING — на группы. Т.е. сначала
GROUP BY разделяет
строки на наборы (по типу), затем на полученные группы накладываются
условия
предложения HAVING.
Если в списке выбора имеются агрегирующие
функции, предложение WHERE выполняется перед ними, тогда как
предложение HAVING
применяется ко всему запросу в целом, после вычисления значений функций
и
разбиения на группы.
С точки зрения синтаксиса условного
выражения, предложения HAVING и WHERE идентичны, отличие состоит лишь в
том,
что в условии предложения WHERE не могут находиться агрегирующие
функции. Кроме
того, элементы предложения HAVING быть перечислены в списке выбора.
Если в предложении HAVING есть несколько условий, они объединяются с
помощью операторов AND, OR и NOT.
Пример
Вывести список городов, количество
клиентов из которых превышает 50 человек:
SQL:
SELECT region, COUNT(*)
FROM tbl_clients
GROUP BY region
HAVING COUNT(*)>50
Результат:
region | COUNT(*)
|
Los Angeles | 99 |
Seattle | 77 |
« Previous | Next »
Использование предложений HAVING и WHERE в одном запросе — визуальные инструменты для работы с базами данных
Редактировать
Твиттер
Фейсбук
Электронная почта
- Статья
Применяется к: SQL Server Azure SQL База данных Azure SQL Управляемый экземпляр Azure Synapse Analytics Analytics Platform System (PDW)
В некоторых случаях может потребоваться исключить отдельные строки из групп (используя предложение WHERE) перед применением условия для групп в целом (используя предложение HAVING).
Предложение HAVING похоже на предложение WHERE, но применяется только к группам в целом (то есть к строкам в результирующем наборе, представляющим группы), тогда как предложение WHERE применяется к отдельным строкам. Запрос может содержать как предложение WHERE, так и предложение HAVING. В этом случае:
Предложение WHERE сначала применяется к отдельным строкам в таблицах или табличным объектам на панели диаграммы. Группируются только те строки, которые соответствуют условиям в предложении WHERE.
Предложение HAVING затем применяется к строкам в результирующем наборе.
В результатах запроса отображаются только те группы, которые соответствуют условиям HAVING. Вы можете применять предложение HAVING только к столбцам, которые также появляются в предложении GROUP BY или в агрегатной функции.
Например, представьте, что вы объединяете таблицы наименований
и издателей
, чтобы создать запрос, показывающий среднюю цену книги для набора издателей. Вы хотите увидеть среднюю цену только для определенного набора издателей — возможно, только для издателей в штате Калифорния. И даже в этом случае вы хотите видеть среднюю цену, только если она превышает 10 долларов США.
Вы можете установить первое условие, включив предложение WHERE, которое отбрасывает всех издателей, которые не находятся в Калифорнии, до расчета средних цен. Для второго условия требуется предложение HAVING, поскольку условие основано на результатах группировки и суммирования данных. Результирующий оператор SQL может выглядеть следующим образом:
SELECT titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id ГДЕ publishers.state = 'CA' СГРУППИРОВАТЬ ПО titles.pub_id ПРИ СРЕДНЕМ (цене) > 10;
В визуальных инструментах для работы с базами данных в SQL Server Management Studio можно создать предложения HAVING и WHERE на панели критериев . По умолчанию, если вы указываете условие поиска для столбца, оно становится частью предложения HAVING. Однако вы можете изменить условие на предложение WHERE.
Вы можете создать предложение WHERE и предложение HAVING с использованием одного и того же столбца. Для этого необходимо дважды добавить столбец на панель Criteria , затем указать один экземпляр как часть предложения HAVING, а другой экземпляр — как часть предложения WHERE.
Чтобы указать условие WHERE в агрегированном запросе
Укажите группы для вашего запроса. Дополнительные сведения см. в разделе Групповые строки в результатах запроса.
Если его еще нет на панели Критерии , добавьте столбец, на котором вы хотите основывать условие WHERE.
Очистите столбец Output , если столбец данных не является частью предложения GROUP BY или включен в агрегатную функцию.
В столбце Фильтр укажите условие ГДЕ. Конструктор запросов и представлений добавляет условие в предложение HAVING оператора SQL.
Примечание
Запрос, показанный в примере для этой процедуры, объединяет две таблицы:
titles
иpublishers
.На этом этапе запроса оператор SQL содержит предложение HAVING:
ВЫБЕРИТЕ titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id СГРУППИРОВАТЬ ПО titles.pub_id НАЛИЧИЕ publishers.state = 'CA'
В столбце Group By выберите Where из списка параметров группировки и сводки.
Конструктор запросов и представлений удаляет условие из предложения HAVING в операторе SQL и добавляет его в предложение WHERE.
Вместо этого оператор SQL включает предложение WHERE:
ВЫБЕРИТЕ titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id ГДЕ publishers.state = 'CA' СГРУППИРОВАТЬ ПО titles.pub_id
См. также
- SELECT — HAVING
Следующие шаги
- Сортировка и группировка результатов запроса
- Суммировать результаты запроса
Обратная связь
Просмотреть все отзывы о странице
Предложение SQL HAVING (с примерами)
В этом руководстве мы узнаем о предложении HAVING в SQL и о том, как их использовать, с примерами.
Предложение SQL HAVING
используется, если нам нужно отфильтровать набор результатов на основе агрегатных функций, таких как MIN() и MAX(), SUM() и AVG() и COUNT().
Пример
-- выберите клиентов с одинаковым именем на основе их возраста ВЫБЕРИТЕ COUNT(возраст) AS Count, first_name ОТ клиентов СГРУППИРОВАТЬ ПО first_name КОЛИЧЕСТВО(возраст) > 1;
Здесь команда SQL
- подсчитывает
age
каждой строки и группирует их поfirst_name
- возвращает набор результатов, если число
age
больше, чем 1 (таким образом отфильтровывая клиентов с тем жеfirst_name
)
Синтаксис SQL HAVING
Синтаксис предложения SQL HAVING
:
SELECT AggFunc(column), extra_columns ИЗ таблицы СГРУППИРОВАТЬ ПО target_column HAVING condition
Здесь
-
AggFunc(столбец)
относится к любой агрегатной функции, примененной к столбцу -
extra_columns
— другие дополнительные столбцы для фильтрации -
GROUP BY
группирует данные поtarget_column
-
НАЛИЧИЕ условия
сравнивает столбец
Пример: SQL HAVING
-- выберите количество идентификаторов клиентов больше одного и соответствующую им страну ВЫБЕРИТЕ COUNT(идентификатор_клиента), страна ОТ клиентов СГРУППИРОВАТЬ ПО СТРАНАМ ИМЕЕТ COUNT(customer_id) > 1;
Здесь команда SQL:
- подсчитывает количество строк, группируя их по странам
- возвращает набор результатов, если их count больше, чем 1 .
Пример: HAVING в SQL
Примечание: Предложение HAVING
было введено, поскольку предложение WHERE
не поддерживает агрегатные функции. Кроме того, перед предложением HAVING
необходимо использовать GROUP BY
. Чтобы узнать больше, посетите SQL GROUP BY.
SQL HAVING vs. WHERE
HAVING Пункт | ГДЕ Пункт |
---|---|
Предложение HAVING проверяет условие группы строк . | Предложение WHERE проверяет условие в каждой отдельной строке . |
HAVING используется с агрегатными функциями. | Предложение WHERE нельзя использовать с агрегатными функциями. |
Предложение HAVING выполняется после предложения GROUP BY . | Предложение WHERE выполняется перед предложением GROUP BY .![]() |