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 в одном запросе — визуальные инструменты для работы с базами данных

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

Твиттер

LinkedIn

Фейсбук

Электронная почта

  • Статья

Применяется к: 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 в агрегированном запросе

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

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

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

  4. В столбце Фильтр укажите условие ГДЕ. Конструктор запросов и представлений добавляет условие в предложение 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'
     
  5. В столбце 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:

  1. подсчитывает количество строк, группируя их по странам
  2. возвращает набор результатов, если их 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 .

Imacros | Все права защищены © 2021