Использование предложений 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 в статистическом запросе
Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.
Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.
Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
В столбце Фильтр укажите условие 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'
В столбце Группировать выберите 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 лет.