Group by having by: HAVING | SQL | SQL-tutorial.ru

Команда HAVING — условие для GROUP BY

Команда HAVING позволяет фильтровать
результат группировки, сделанной с помощью
команды GROUP
BY.

Синтаксис

GROUP BY поле HAVING условие

Таблицы для примеров

таблица employees
id
айди
name
имя
age
возраст
salary
зарплата
1user123400
2user225500
3user323500
4user430900
5user527500
6user628900

Пример

В данном примере демонстрируется работа GROUP
BY без условия HAVING при выборке из таблицы:

SELECT age, SUM(salary) as sum FROM employees GROUP BY age

Результат выполнения кода:

age
возраст
sum
сумма
23600
243000
25900

Пример

А теперь с помощью условия HAVING оставим
только те строки, в которых суммарная зарплата
больше или равна 1000:

SELECT age, SUM(salary) as sum FROM employees GROUP BY age HAVING sum>=1000

Результат выполнения кода:

age
возраст
sum
сумма
243000
25900

Пример

Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):

SELECT age, COUNT(*) as count FROM employees GROUP BY age

Результат выполнения кода:

age
возраст
count
количество
233
242
251

Пример

А теперь с помощью условия HAVING
оставим только те группы, в которых количество
строк меньше или равно двум:

SELECT age, COUNT(*) as count FROM employees GROUP BY age HAVING count<=2

Результат выполнения кода:

age
возраст
count
количество
242
251

Пример

Аналогичного эффекта можно достигнуть, если
воспользоваться командой IN:

SELECT age, COUNT(*) as count FROM employees GROUP BY age HAVING count IN(1,2)

Пример

Можно также использовать команду BETWEEN:

SELECT age, COUNT(*) as count FROM employees GROUP BY age HAVING count BETWEEN 1 AND 2

Группа

по пунктам и с ними Группа

по пунктам и с ними


Используется в операторах select для разделения таблицы на группы и возврата
только группы, которые соответствуют условиям в предложении have. группа
by обычно используется с агрегатами, чтобы указать, как группировать неагрегированные
столбцы запроса на выборку. наличие оговорок применяется к
эти группы.

Синтаксис

  Начало оператора  select   
 [группировать по [всем]  агрегатное_бесплатное_выражение 
[  агрегатное_свободное_выражение ]...] 
 [имея  условий поиска  ] 
  Конец  оператор select   

Параметры

9 0031

  • group by — указывает группы, на которые разбита таблица,
    и если агрегатные функции включены в список выбора, находит
    суммарное значение для каждой группы. Эти сводные значения отображаются в виде столбцов
    в результатах по одному на каждую группу. Вы можете обратиться к этим резюме
    столбцы в предложении have.

    Вы можете использовать avg, count, count_big, max, min,
    и суммировать агрегатные функции в списке выбора
    перед группировкой (выражение обычно представляет собой столбец
    имя). См. Справочное руководство : Стандартные блоки .

    Таблица может быть
    сгруппированы по любой комбинации столбцов, т. е. группы могут быть
    вложены друг в друга, как в примере 2.

  • все — расширение Transact-SQL, включающее
    все группы в результатах, даже исключенные предложением where.
    Например:

     выбрать тип, средняя (цена)
    из названий
    где аванс > 7000
    сгруппировать по всем типам 
     типа
    ------------------  -------------------------
    НЕОПРЕДЕЛЕННО                NULL
    бизнес                 2,99
    mod_cook                 2.99
    Popular_comp            20.00
    психология               NULL
    trad_cook               14,99
     (затронуто 6 рядов) 

    «НУЛЬ» в
    агрегированный столбец указывает группы, которые будут исключены
    пункт где. Оговорка наличия
    отрицает смысл всего.

  • aggregate_free_expression — выражение, не содержащее агрегатов. А
    Расширение Transact-SQL позволяет группировать по
    выражение, а также по имени столбца. Вы
    нельзя группировать по заголовку столбца или псевдониму. Этот пример правильный:

     select Price=avg (цена), Pay=avg (аванс),
    Итого=цена * 1,15 доллара США
    из названий
    сгруппировать по цене * $1,15 
  • имея – устанавливает условия группировки по пункту,
    аналогично тому, как where задает условия
    для предложения выбора. , имеющие условия поиска, могут включать агрегированные выражения; в противном случае,
    условия поиска идентичны где
    условия поиска. Это пример наличия предложения с
    агрегаты:

     выберите pub_id, итог = сумма (общие_продажи)
    из названий
    где total_sales не равен нулю
    группировать по pub_id
    имея количество (*)>5 

    Когда сервер SAP ASE оптимизирует запросы, он оценивает условия поиска в
    где и имея предложения, и определяет, какие
    условия — это аргументы поиска (SARG), которые можно использовать для выбора наилучших индексов и
    план запроса. Все условия поиска используются для квалификации строк. Для дополнительной информации
    по аргументам поиска см. Руководство по производительности и настройке: оптимизатор и реферат
    Планы
    .

  • Примеры

    • Пример 1 – Расчет среднего аванса и суммы продаж для каждого типа
      book:

       выберите тип, avg (аванс), сумма (total_sales)
      из названий
      группировка по типу 
    • Пример 2 — группирует результаты по типу, затем по pub_id внутри каждого
      тип:

       выберите тип, pub_id, avg (аванс), сумма (total_sales)
      из названий
      группировать по типу, pub_id 
    • Пример 3 — Вычисляет результаты для всех групп, но отображает только те группы, тип которых начинается с
      «p»:

       выбрать тип, средняя (цена)
      из названий
      группировать по типу
      с типом 'p%' 
    • Пример 4 — Вычисляет результаты для всех групп, но отображает результаты для групп, соответствующих множеству
      условия в наличии
      пункт:

       выберите pub_id, sum (аванс), avg (цена)
      из названий
      группировать по pub_id
      имея сумму (аванс) > $15000
      и средняя (цена) < $10
      и pub_id > "0700" 
    • Пример 5 – Расчет общего объема продаж для каждой группы (издателя) после присоединения наименований
      и издателей
      таблицы:

       выберите p. pub_id, сумма (t.total_sales)
      от издателей p, заголовков t
      где p.pub_id = t.pub_id
      группа по p.pub_id 
    • Пример 6 — Отображает названия, которые имеют аванс более 1000 долларов США и цену, превышающую
      средняя цена всего
      titles:

       выберите title_id, заранее, цена
      из названий
      где аванс > 1000
      цена > avg (цена) 

    Использование

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

    • Максимальное количество групп по столбцам (или выражениям) явно не ограничено. Единственный
      ограничение группы по результатам состоит в том, что ширина группы по столбцам плюс
      совокупные результаты не превышают 64K.

    • Нулевые значения в группе по столбцу помещаются в одну группу.

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

    • Вы не можете использовать предложение group by в выборе
      оператор обновляемого курсора.

    • Агрегированные функции можно использовать только в списке выбора или в
      пункт. Их нельзя использовать в where или group by
      пункт.

      Агрегатные функции бывают двух типов. Агрегаты применялись к 90 154 всем подходящим строкам в
      таблица (производящая одно значение для всей таблицы для каждой функции) называется скалярной
      агрегаты
      . Агрегатная функция в списке выбора без группировки по
      предложение применяется ко всей таблице; это один из примеров скалярного агрегата.

      Агрегаты применяются к группе строк в указанном столбце или выражении (производящем
      значение для каждой группы на функцию) называются векторные агрегаты . Для любого агрегата
      тип, результаты агрегатных операций отображаются в виде новых столбцов,
      имеющий пункт может ссылаться на.

      Вы можете вложить векторный агрегат в скалярный агрегат. См. справочное руководство :
      Строительные блоки
      для получения дополнительной информации.

    См. также Функции Transact-SQL в Справочном руководстве : Сборка
    Блоки
    .

    Стандарты

    ANSI SQL — Уровень соответствия: начальный уровень
    совместимый.

    Использование столбцов в списке выбора
    которые не входят в группу по списку и не имеют
    агрегатные функции — это расширение Transact-SQL.

    Использование ключевого слова all является расширением Transact-SQL.

    Ссылки, связанные с данной

    Расширения Transact-SQL для группировки и наличия

    вычислений Пункт

    объявить

    выбрать

    где пункт


    Создано 28 мая 2014 г. Отправьте отзыв по этому разделу справки в Технические публикации:
    [email protected]

    Как использовать операторы GROUP BY, HAVING и ORDER BY SQL

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

    GROUP BY пункты

    Иногда вместо того, чтобы извлекать отдельные записи, вы хотите узнать что-то о группе записей. Предложение GROUP BY — это инструмент, который вам нужен.

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

     SELECT InvoiceNo, SaleDate, Продавец, TotalSale
     ОТ ПРОДАЖ; 

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

    Чтобы провести реальный анализ, вы можете объединить предложение GROUP BY с одной из агрегатных функций (также называемых функциями набора ), чтобы получить количественную картину эффективности продаж. Например, вы можете увидеть, какой продавец продает больше прибыльных дорогостоящих товаров, используя функцию среднего (AVG) следующим образом:

     ВЫБЕРИТЕ Продавца, AVG(TotalSale)
     ОТ ПРОДАЖ
     ГРУППА ПО ПРОДАВЦАМ; 

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

    Средняя стоимость продаж Беннета значительно выше, чем у двух других продавцов. Вы сравниваете общий объем продаж с аналогичным запросом:

     ВЫБЕРИТЕ Продавец, СУММ(ОбщаяПродажа)
     ОТ ПРОДАЖ
     ГРУППА ПО ПРОДАВЦАМ; 

    Bennett также имеет самый высокий общий объем продаж, что согласуется с самым высоким средним объемом продаж.

    НАЛИЧИЕ пунктов

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

    Его работа искажает общие данные для других продавцов. (Ага — разрушитель кривых.) Вы можете исключить продажи Bennett из сгруппированных данных, используя предложение HAVING следующим образом:

     ВЫБЕРИТЕ Продавца, СУММ(ОбщаяПродажа)
     ОТ ПРОДАЖ
     СГРУППИРОВАТЬ ПО ПРОДАВЦАМ
     ИМЕЕТ Продавца <> «Беннетт»; 

    Учитываются только строки, в которых продавцом не является Беннет.

    Пункты ORDER BY

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

    Если запрос также содержит предложение GROUP BY, это предложение сначала упорядочивает выходные строки в группы. Затем предложение ORDER BY сортирует строки в каждой группе. Если у вас нет предложения GROUP BY, тогда инструкция рассматривает всю таблицу как группу, а предложение ORDER BY сортирует все ее строки в соответствии со столбцом (или столбцами), указанными в предложении ORDER BY.

    Чтобы проиллюстрировать это, рассмотрим данные в таблице SALES. Таблица SALES содержит столбцы для InvoiceNo, SaleDate, Salesperson и TotalSale. Если вы используете следующий пример, вы увидите все данные в таблице SALES, но в произвольном порядке:

     ВЫБРАТЬ * ИЗ ПРОДАЖ ; 

    В одной реализации это может быть порядок вставки строк в таблицу; в другой реализации порядок может быть порядком самых последних обновлений. Порядок также может неожиданно измениться, если кто-то физически реорганизует базу данных. Это одна из причин, по которой обычно рекомендуется указывать порядок, в котором вам нужны строки.

    Например, вы можете захотеть отсортировать строки по дате продажи следующим образом:

     ВЫБРАТЬ * ИЗ ЗАКАЗА НА ПРОДАЖУ ПО дате продажи ; 

    В этом примере возвращаются все строки таблицы SALES, упорядоченные по дате продажи.
    Для строк с одинаковым значением SaleDate порядок по умолчанию зависит от реализации. Однако вы можете указать, как сортировать строки, имеющие одинаковую дату продажи. Вы можете просмотреть продажи для каждой даты продажи в порядке по номеру счета-фактуры следующим образом:

     ВЫБРАТЬ * ИЗ ЗАКАЗА НА ПРОДАЖУ ПО Дата продажи, № счета-фактуры ; 

    В этом примере продажи сначала упорядочиваются по дате продажи; затем для каждой даты продажи он упорядочивает продажи по номеру счета-фактуры. Но не путайте этот пример со следующим запросом:

     ВЫБРАТЬ * ИЗ ЗАКАЗА НА ПРОДАЖУ ПО № счета-фактуры, Дата продажи ; 

    Этот запрос сначала упорядочивает продажи по INVOICE_NO. Затем для каждого другого InvoiceNo запрос упорядочивает продажи по дате продажи.