Having в sql: Оператор SQL HAVING: примеры, синтаксис

Использование предложений HAVING и WHERE в одном запросе — Visual Database Tools

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)

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

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

  • Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.

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

Например, соединяются таблицы titles и publishers, чтобы создать запрос, показывающий среднюю цену книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. При этом нужно показать только те средние цены, которые превышают $10,00.

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

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10;  

В визуальных инструментах базы данных среды SQL Server Management Studio можно создать оба предложения HAVING и WHERE на панели условий. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.

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

Задание условия WHERE в статистическом запросе

  1. Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.

  2. Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.

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

  4. В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.

    Примечание

    В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers.

    В этой точке в запросе инструкции SQL содержится предложение HAVING:

    SELECT titles. pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.

    Инструкция SQL изменяется, теперь она содержит предложение WHERE:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

См. также

  • SELECT — HAVING

Дальнейшие действия

  • Сортировка и группировка результатов запроса
  • Резюмирование результатов запросов

HAVING (Transact-SQL) — SQL Server

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Применимо к: 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)

ИМЕЕТ (Transact-SQL) — SQL Server

Редактировать

Твиттер LinkedIn Фейсбук Электронная почта

  • Статья
  • 2 минуты на чтение

Применяется к: SQL Server Azure SQL База данных Azure SQL Управляемый экземпляр Azure Synapse Analytics Analytics Platform System (PDW)

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

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

Синтаксис

 [ HAVING <условие поиска> ]
 

Примечание

Чтобы просмотреть синтаксис Transact-SQL для SQL Server 2014 и более ранних версий, см. документацию по предыдущим версиям.

Аргументы

<условие_поиска> Задает один или несколько предикатов для групп и/или агрегатов. Дополнительные сведения об условиях поиска и предикатах см. в разделе Условия поиска (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 and Analytics Platform System (PDW)

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

 -- Использует AdventureWorks
  
ВЫБЕРИТЕ OrderDateKey, SUM (SalesAmount) AS TotalSales
ОТ FactInternetSales
СГРУППИРОВАТЬ ПО OrderDateKey
СУММА(SalesAmount) > 80000
ЗАКАЗАТЬ ПО OrderDateKey;
 

См.

также

СГРУППИРОВАТЬ ПО (Transact-SQL)
ГДЕ (Transact-SQL)

Предложение HAVING в агрегатных функциях SQL

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

Оператор HAVING почти аналогичен оператору WHERE и может выполняться вместе с ним.

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

Операторы GROUP BY и WHERE в SQL

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

Допустим, мы хотим получить значение Total Sales продукта на основе его столбца SaleAmount , где значение больше 2 . Чтобы получить результат, наша команда должна быть следующей:

Сначала мы выбираем ProductName и агрегируем SaleAmount , чтобы получить TotalSales.

Затем мы использовали оператор WHERE здесь, поскольку мы пытаемся получить только те продукты, где SaleAmount больше 2. Команда ‘GROUP BY ProductName’ указывает, что она будет группировать строки под столбцом ProductName в один.

Выполнив наш набор команд, мы увидим, что из всех данных в столбцах , ProductName и SaleAmount отображались только Bulb и Fan . Это потому, что они были единственными , у которых SaleAmount больше, чем 2.

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

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

В этом примере мы собираемся продемонстрировать разницу между оператором WHERE и предложением HAVING . Мы будем использовать ту же цель, что и в предыдущем примере, чтобы мы могли сравнить и оценить результаты.

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

Если мы выполним наши первые две команды, мы получим следующий результат:

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

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

Давайте выполним эти команды вместе с HAVING SUM(SaleAmount)>5 . Указав, что мы хотим получить только те товары, общая стоимость которых больше 5, мы заметим, что в нашей текущей таблице результатов мы больше не увидим Pen . Это потому, что его сумма меньше 5 .

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

Предложение HAVING And WHERE в SQL Server Management Studio (SSMS)

Теперь мы двинемся вперед, обсудив и продемонстрировав, как мы можем выполнить ИМЕЕТ предложение в SQL Server Management Studio (SSMS). Мы также рассмотрим разницу между предложением HAVING и предложением WHERE , приведя примеры.

Ниже показан пример данных SalesOrderHeader. Эти данные состоят из 100 строк. В нашем примере мы хотим, чтобы получил TotalSale по CustomerID , где TotalSale больше, чем 10000 . Обратите внимание, что общая сумма продажи основана на сумме TotalDue значений столбца.

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

Мы будем использовать пример набора команд с изображения ниже. Как видите, технически у нас тот же набор команд, что и в самом первом примере.

Однако, когда мы нажмем Выполнить в верхнем левом углу, это приведет к ошибке, потому что мы не можем использовать Только предложение WHERE , когда мы фильтруем агрегатную функцию.

Чтобы исправить ошибку, нам нужно отфильтровать результат, используя предложение HAVING вместо предложения WHERE . Наш новый набор команд должен быть похож на изображение ниже.

Теперь мы видим, что наша ошибка была исправлена ​​и содержит результаты для CustomerID с TotalSale больше, чем 10000 .

Опять же, пункт 9 WHERE0020 всегда используется перед предложением GROUP BY , тогда как предложение HAVING всегда используется после предложения GROUP BY .

Использование как предложения HAVING, так и предложения WHERE в SQL

Допустим, в этом примере мы хотим использовать предложение WHERE и HAVING одновременно. Давайте попробуем получить TotalSale по CustomerID , где TotalSale больше, чем 10000 , но только с клиентами, где их TerritoryID равен 1 .

Поскольку мы хотим отфильтровать результаты с клиентами, у которых 1 в качестве TerritoryID , мы будем использовать предложение WHERE. Итак, наша команда должна быть такой же, как и предыдущая. Опять же, мы добавили предложение WHERE перед предложением GROUP BY.

На данный момент мы не видим большой разницы между нашим предыдущим результатом и этим новым. Однако, если вы внимательно посмотрите на нижний правый угол, у нас теперь только 64 строки по сравнению с предыдущим с 505 строками данных. Это потому, что результаты также фильтруются на основе их TerritoryID .

***** Дополнительные ссылки *****
ISNULL Функция SQL в операторах case
Оператор SQL SELECT: введение
Общие табличные выражения SQL для пользователей Power BI

Заключение

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

Использование предложения HAVING в агрегатных функциях SQL и отработка способов совместного выполнения предложений HAVING и WHERE может обеспечить пользователям удобство при работе с большим количеством данных или записей.

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

Всего наилучшего,

Хафиз

 

***** Изучение Power BI? *****
БЕСПЛАТНЫЙ КУРС — Полное руководство для начинающих по Power BI
БЕСПЛАТНЫЙ КУРС — Полное руководство для начинающих по DAX
БЕСПЛАТНО — 60-страничное справочное руководство по DAX Скачать
БЕСПЛАТНО — Power BI Resource
Enterprise DNA On-Demand
Доступ к платформе Enterprise DNA
События Enterprise DNA

 

 

 

Теги: GROUPBY в SQL, SQL для Power BI, функция SQL HAVING, запросы SQL, оператор SQL SELECT, SQL Server Management Studio, предложение SQL WHERE

Опубликовано Хафизом Зубайром Султаном

Хафиз проработал в сфере информационных технологий и телекоммуникаций более 14 лет.

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

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

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