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)
SQL предложения HAVING
w3big.com
Latest web development tutorials
Предыдущий: SQL GROUP BY заявление
Функция SQL UCASE (): Следующий
предложения HAVING
Увеличение SQL предложения HAVING, потому что, WHERE ключевое слово нельзя использовать с агрегатными функциями.
Предложения HAVING позволяет фильтровать после каждого набора пакетов данных.
SQL HAVING Синтаксис
SELECT column_name, aggregate_function(column_name)
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
Демонстрационная база данных
В этом уроке мы будем использовать w3big образец базы данных.
Ниже приводится выбранные «сайты» таблица данных:
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 本教程 | http://www.w3big.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
Вот данные «access_log» веб-сайт записи доступа к таблице:
mysql> SELECT * FROM access_log; +-----+---------+-------+------------+ | aid | site_id | count | date | +-----+---------+-------+------------+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-14 | | 4 | 2 | 10 | 2016-05-14 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-15 | | 7 | 3 | 220 | 2016-05-15 | | 8 | 5 | 545 | 2016-05-16 | | 9 | 3 | 201 | 2016-05-17 | +-----+---------+-------+------------+ 9 rows in set (0.00 sec)
Примеры SQL HAVING
Теперь мы хотим, чтобы найти общее число посещений больше, чем 200 сайтов.
Мы используем следующую инструкцию SQL:
примеров
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM
(access_log
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;
Выполнить выше SQL вывода результатов заключаются в следующем:
Теперь мы хотим, чтобы найти общее число посещений больше, чем 200 сайтов, и менее чем 200 тИЦ.
Добавим обычный оператор SQL предложения WHERE:
примеров
SELECT Websites.name, SUM(access_log.count) AS nums FROM
Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
WHERE Websites.alexa GROUP BY Websites.name
HAVING
SUM(access_log.count) > 200;
Выполнить выше SQL вывода результатов заключаются в следующем:
Предыдущий: SQL GROUP BY заявление
Функция SQL UCASE (): Следующий
w3big.
SQL Предложение HAVING — промежуточный SQL
На этом уроке рассматривается предложение SQL HAVING , которое дополняет предложение GROUP BY . Предложение HAVING действует как фильтр на уровне группы. Если вы думаете о WHERE как о предложении фильтра, ориентированном на записи, то HAVING — это предложение фильтра, ориентированное на группы записей, созданных с помощью предложения GROUP BY .
В предложении HAVING можно указать логические условия, включающие столбцы и агрегатные функции. Все допустимые элементы в Список SELECT , может быть включен в предложение HAVING .
Вот пример таблицы. Предположим, вы работаете на ферме, выращивающей яблоки. База данных содержит одну таблицу с именем apple со всей историей производства. Таблица имеет следующую схему:
| Год | Разнообразие яблок | Количество деревьев в производстве | Произведенотонн | День сбора урожая | Цена за тонну | Первый летний шторм |
|---|---|---|---|---|---|---|
| 2020 | Красный вкусный | 2000 | 102 | 23. 06.2020 | 54,50 | 03.07.2020 |
| 2020 | Волшебный зеленый | 700 | 33 | 12.06.2020 | 62,60 | 03.07.2020 |
| 2020 | Красный Глобус | 500 | 26 | 30.05.2020 | 71,50 | 03.07.2020 |
| 2019 | Красный вкусный | 1800 | 87 | 15.07.2019 | 52,25 | 12.07.2019 |
| 2019 | Волшебный зеленый | 500 | 26 | 28.06.2019 | 59,40 | 12.07.2019 |
| 2019 | Красный Глобус | 500 | 27 | 28.05.2019 | 68,00 | 12.07.2019 |
| 2018 | Красный вкусный | 1800 | 92 | 02.07.2018 | 56,75 | 03.06.2018 |
| 2018 | Красный Глобус | 500 | 24 | 30. 05.2018 | 66. | 03.06.2018 |
| 2017 | Красный вкусный | 1500 | 76,5 | 18.07.2017 | 51,45 | 30.07.2017 |
| 2016 | Красный вкусный | 1500 | 72 | 26.06.2016 | 47,60 | 23.06.2016 |
Предположим, вы хотите создать отчет, показывающий те годы, когда ферма произвела более 100 тонн яблок. Вам нужно условие, подобное:
СУММ(тонн_произведено) > 100
Вы не можете поместить это условие в предложение WHERE , так как WHERE не допускает функцию агрегирования. Здесь вы используете ИМЕЮЩИЙ пункт:
ВЫБЕРИТЕ год,
СУММ(тонн_произведено) КАК Всего_произведено_яблок
ИЗ яблока
СГРУППИРОВКА ПО ГОДАМ
СУММА (тонн_произведено) > 100
Результат:
| Год | Total_apple_produced |
|---|---|
| 2020 | 161 |
| 2019 | 140 |
| 2018 | 116 |
В этом примере запроса вы получаете пары , где показатель долларов за дерево выше 3,0.
ВЫБЕРИТЕ сорт_яблока,
AVG((произведено_тонн * цена_за_тонну)/количество_деревьев) КАК avg_доллар_за_дерево,
ИЗ яблока
СГРУППИРОВАТЬ ПО apple_variety
ИМЕЕТ СРЕДНИЙ ((тонн_произведено * цена_за_тонну)/количество_деревьев)> 3,0
Вот результат:
| яблоко_сорт | avg_dollar_per_tree |
|---|---|
| Волшебный зеленый | 3,01 |
| Красный глобус | 3,51 |
В этом уроке вы использовали предложение SQL HAVING с примерами предложения HAVING с использованием агрегатных функций. Следующий урок представляет ПОДЗАПРОСЫ , действительно интересную и мощную тему. Подзапросы могут использоваться в нескольких различных частях SELECT и даже в других операторах SQL , таких как UPDATE , DELETE или INSERT .
Продолжайте в том же духе, изучайте 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 предназначен для фильтрации результатов с помощью существующего столбца, который является нашим SaleAmount .
Также обратите внимание, что оператор WHERE появляется перед GROUP BY и не может использоваться для фильтрации агрегатных функций. С другой стороны, предложение HAVING появляется после GROUP BY и используется для фильтрации на основе агрегатной функции.
Предложение GROUP BY And HAVING в SQL
В этом примере мы собираемся продемонстрировать разницу между предложением WHERE и предложением HAVING . Мы будем использовать ту же цель, что и в предыдущем примере, чтобы мы могли сравнить и оценить результаты.
Давайте сначала отобразим продукты с их общим объемом продаж, используя приведенную ниже команду. Как видите, наша первая команда все еще такая же, как наша первая команда, выполняющая ГДЕ заявление.
Если мы выполним наши первые две команды, мы получим следующий результат:
Теперь предположим, что мы хотим отображать только товары, общая сумма продаж которых превышает 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)
Теперь мы перейдем к обсуждению и демонстрации того, как мы можем выполнить предложение HAVING в SQL Server Management Studio (SSMS). Мы также рассмотрим разницу между HAVING пункт и WHERE пункт , предоставив примеры.
Ниже показан пример данных SalesOrderHeader. Эти данные состоят из 100 строк. В нашем примере мы хотим, чтобы получил TotalSale по CustomerID , где TotalSale больше, чем 10000 . Обратите внимание, что общая сумма продаж основана на сумме значений столбца TotalDue .
Во-первых, позвольте мне продемонстрировать, почему мы не можем использовать WHERE предложение , когда мы хотим отфильтровать агрегатную функцию на основе нашего примера выше.
Мы будем использовать примерный набор команд с изображения ниже. Как видите, технически у нас тот же набор команд, что и в самом первом примере.
Однако, когда мы нажмем Execute в верхнем левом углу, это приведет к ошибке, потому что мы не можем использовать только предложение WHERE при фильтрации агрегатной функции.
Чтобы исправить ошибку, нам нужно отфильтровать результат, используя предложение HAVING вместо предложения WHERE . Наш новый набор команд должен быть похож на изображение ниже.
Теперь мы видим, что наша ошибка исправлена и содержит результаты для CustomerID с TotalSale больше, чем 10000 .
Опять же, предложение WHERE всегда используется перед предложением 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. Если вы хотите узнать больше об этой теме и другом связанном контенте, вы, безусловно, можете просмотреть список соответствующих ссылок ниже.

com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
06.2020
05.2018