Sql group by having: SQL GROUP BY Statement
HAVING оператор — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Этот SQL учебник объясняет, как использовать SQL HAVING с синтаксисом и примерами.
Описание
SQL оператор HAVING используется в сочетании с GROUP BY, чтобы ограничить группы возвращаемых строк, только тех, чьи условия истинны.
Синтаксис
SELECT expression1, expression2, … expression_n,
aggregate_function (aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n
HAVING condition;
Параметры или аргументы
expression1, expression2, … expression_n — выражения, которые не входят в aggregate_function и должны быть включены в предложение GROUP BY в конце оператора SQL.
aggregate_function — это функция, такая как SUM, COUNT, функции MIN, MAX или AVG.
aggregate_expression – это столбец или выражение, которое используется в aggregate_function.
tables – таблицы из которых вы хотите выгрузить данные. После оператора FROM должна быть указана хотя бы одна таблица.
WHERE conditions. Необязательный. Условия, которые должны быть выполнены для выбранных записей.
HAVING condition. Это еще одно условие применяется только к агрегированным результатам, чтобы ограничить группы возвращаемых строк. В набор результатов будут включены только те группы, состояние которых оценивается как TRUE.
Пример — Использование функции SUM
Рассмотрим на примере SQL HAVING, который использует функцию SUM.
Вы можете использовать функцию SUM, чтобы вернуть наименование department (отдела) и total sales (общий объем продаж в соответствующем отделе). SQL HAVING будет фильтровать результаты, так, что будут возвращены только department с total sales более $ 1000.
SELECT department, SUM(sales) AS «Total sales»
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000;
SELECT department, SUM(sales) AS «Total sales» FROM order_details GROUP BY department HAVING SUM(sales) > 1000; |
Пример — Использование функции COUNT
Рассмотрим, как можно использовать HAVING с помощью функции COUNT.
Вы можете использовать функцию COUNT, чтобы вернуть название department (отдела) и number of employees (численность работников в соответствующем отделе), которые делают более $ 25000 / год. SQL оператор HAVING будет фильтровать результаты, так что будут возвращены department с более чем 10 сотрудников.
SELECT department, COUNT(*) AS «Number of employees»
FROM employees
WHERE salary > 25000
GROUP BY department
HAVING COUNT(*) > 10;
SELECT department, COUNT(*) AS «Number of employees» FROM employees WHERE salary > 25000 GROUP BY department HAVING COUNT(*) > 10; |
Пример — Использование функции MIN
В следующем примере рассмотрим, как можно использовать HAVING с помощью функции MIN.
Можно также использовать функцию SQL MIN, чтобы вернуть название каждого department (отдела) и minimum salary (минимальную зарплату в отделе). SQL оператор HAVING будет возвращать только те department, где minimum salary составляет более $ 35 000.
SELECT department, MIN(salary) AS «Lowest salary»
FROM employees
GROUP BY department
HAVING MIN(salary) > 35000;
SELECT department, MIN(salary) AS «Lowest salary» FROM employees GROUP BY department HAVING MIN(salary) > 35000; |
Пример — Использование функции MAX
И, наконец, рассмотрим, как можно использовать HAVING с помощью функции MAX.
Вы можете также использовать функцию MAX, чтобы вернуть название каждого department (отдела) и maximum salary (максимальную зарплату в отделе). SQL оператор HAVING будет возвращать только те department, где maximum salary менее $ 50000.
SELECT department, MAX(salary) AS «Highest salary»
FROM employees
GROUP BY department
HAVING MAX(salary) < 50000;
SELECT department, MAX(salary) AS «Highest salary» FROM employees GROUP BY department HAVING MAX(salary) < 50000; |
Команда SELECT Раздел HAVING « Язык запросов SQL
Раздел HAVING
Наконец, последним при вычислении табличного выражения используется раздел HAVING (если он присутствует).
Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.
Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.
Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.
HAVING COUNT
Выбрать коды товаров, покупаемых более чем одним покупателем:
SELECT st
SQL-Урок 8. Группировка данных (GROUP BY)
Группировка данных позволяет разделить все данные на логические наборы, благодаря чему становится возможным выполнение статистических вычислений отдельно в каждой группе.
1. Создание групп (GROUP BY)
Группы создаются с помощью предложения GROUP BY оператора SELECT. Рассмотрим на примере.
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product
Данным запросом мы извлекли информацию о количестве реализованной продукции в каждом месяце. Оператор SELECT приказывает вывести два столбца Product — название продукта и Product_num — расчетное поле, которое мы создали для отображения количества реализованной продукции (формула поля SUM (Quantity)). Предложение GROUP BY указывает СУБД сгруппировать данные по столбцу Product. Стоит также отметить, что GROUP BY должен идти после предложения WHERE и перед ORDER BY.
2. Фильтрующие группы (HAVING)
Так же, как мы фильтровали строки в таблице, мы можем осуществлять фильтрацию по сгруппированным данным. Для этого в SQL существует оператор HAVING. Возьмем предыдущий пример и добавим фильтрацию по группам.
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>4000
Видим, что после того, как была посчитана количество реализованного товара в разрезе каждого продукта, СУБД «отсекла» те продукты, которых было реализовано меньше 4000 шт.
Как видим, оператор HAVING очень похож на оператора WHERE , однако между собой они имеют существенное отличие: WHERE фильтрует данные до того, как они будут сгруппированы, а HAVING — осуществляет фильтрацию после группировки. Таким образом, строки, которые были изъяты предложением WHERE НЕ будут включены в группу. Итак, операторы WHERE и HAVING могут использоваться в одном предложении. Рассмотрим пример:
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct WHERE Product<>’Skis Long’ GROUP BY Product HAVING SUM(Quantity)>4000
Мы к предыдущему примеру добавили оператор WHERE, где указали товар Skis Long, что в свою очередь повлияло на группирование оператором HAVING. Как результат видим, что товар Skis Long не попал в перечень групп с количеством реализованной продукции больше 4000 шт.
3. Группировка и сортировка
Как и при обычной выборке данных, мы можем сортировать группы после группировки оператором HAVING. Для этого мы можем использовать уже знакомый нам оператор ORDER BY. В данной ситуации его применения аналогичное предыдущим примерам. К примеру:
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY SUM(Quantity)
или просто укажем номер поля по порядку, по которому хотим сортировать:
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY 2
Видим, что для сортировки сводных результатов нам нужно просто прописать предложения с ORDER BY после оператора HAVING. Однако есть один нюанс. СУБД Access не поддерживает сортировку групп по псевдонимами колонок, то есть в нашем примере, чтобы сортировать значения, мы не сможем в конце запроса прописать ORDER BY Product_num .
Как использовать предложения SQL GROUP BY, HAVING и ORDER BY
- Программирование
- SQL
- Как использовать предложения SQL GROUP BY, HAVING и ORDER BY
Аллен Г. Тейлор
SQL дает вы можете получать, анализировать и отображать необходимую информацию с помощью предложений GROUP BY, HAVING и ORDER BY. Вот несколько примеров того, как их можно использовать.
GROUP BY статьи
Иногда, вместо того, чтобы извлекать отдельные записи, вам нужно что-то узнать о группе записей.Предложение GROUP BY — это инструмент, который вам нужен.
Предположим, вы — менеджер по продажам в другом офисе и хотите посмотреть, как работают ваши торговые представители. Если вы выполните простой SELECT, например следующий запрос:
SELECT InvoiceNo, SaleDate, Salesperson, TotalSale ОТ ПРОДАЖ;
Этот результат дает вам некоторое представление о том, насколько хорошо работают ваши продавцы, поскольку в них задействовано очень мало общих продаж. Однако в реальной жизни у компании было бы намного больше продаж — и было бы не так просто определить, были ли достигнуты цели продаж.
Для проведения реального анализа вы можете объединить предложение GROUP BY с одной из агрегированных функций (также называемых функциями набора ), чтобы получить количественную картину эффективности продаж. Например, вы можете увидеть, какой продавец продает больше прибыльных дорогостоящих товаров, используя функцию среднего (AVG):
SELECT Продавец, AVG (TotalSale) ОТ ПРОДАЖ ГРУППА ПО продавцу;
Выполнение запроса с другой системой управления базами данных приведет к тому же результату, но может показаться немного другим.
Средняя стоимость продаж Беннета значительно выше, чем у двух других продавцов. Вы сравниваете общий объем продаж с аналогичным запросом:
ВЫБЕРИТЕ продавца, СУММ (TotalSale) ОТ ПРОДАЖ ГРУППА ПО продавцу;
Bennett также имеет самый высокий общий объем продаж, что соответствует самым высоким средним продажам.
ИМЕЮЩИЕ статьи
Вы можете дополнительно проанализировать сгруппированные данные, используя предложение HAVING.Предложение HAVING — это фильтр, который действует аналогично предложению WHERE, но для групп строк, а не для отдельных строк. Чтобы проиллюстрировать функцию предложения HAVING, предположим, что менеджер по продажам считает, что Беннетт принадлежит к классу.
Его работа искажает общие данные для других продавцов. (Ага, ломка кривой.) Вы можете исключить продажи Беннета из сгруппированных данных, используя предложение HAVING следующим образом:
ВЫБЕРИТЕ продавца, СУММ (TotalSale) ОТ ПРОДАЖ ГРУППА ПО Продавцу ИМЕЕТ продавца <> «Беннетт»;
Учитываются только строки, в которых продавец не является Беннетом.
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, но в произвольном порядке:
ВЫБРАТЬ * ИЗ ПРОДАЖ;
В одной реализации это может быть порядок, в котором вы вставляли строки в таблицу; в другой реализации порядок может быть последним обновлением.Порядок также может неожиданно измениться, если кто-либо физически реорганизует базу данных. Это одна из причин, по которой обычно рекомендуется указывать порядок, в котором вам нужны строки.
Вы можете, например, захотеть увидеть строки в порядке по дате продажи следующим образом:
ВЫБРАТЬ * ИЗ ЗАКАЗА ПРОДАЖ ПО SaleDate;
В этом примере возвращаются все строки в таблице SALES в порядке SaleDate.
Для строк с одинаковым SaleDate порядок по умолчанию зависит от реализации.Однако вы можете указать, как сортировать строки с одним и тем же SaleDate. Вы можете просмотреть продажи для каждой SaleDate в порядке InvoiceNo, как показано ниже:
ВЫБРАТЬ * ИЗ ЗАКАЗА ПРОДАЖ по дате продажи, номеру счета-фактуры;
В этом примере продажи сначала упорядочиваются по SaleDate; затем для каждого SaleDate он упорядочивает продажи по InvoiceNo. Но не путайте этот пример со следующим запросом:
ВЫБРАТЬ * ИЗ ЗАКАЗА ПРОДАЖ ПО InvoiceNo, SaleDate;
Этот запрос сначала упорядочивает продажи по INVOICE_NO.Затем для каждого отдельного InvoiceNo запрос упорядочивает продажи по SaleDate. Вероятно, это не даст желаемого результата, потому что маловероятно, что для одного номера счета-фактуры будет несколько дат продажи.
Следующий запрос — еще один пример того, как SQL может возвращать данные:
ВЫБРАТЬ * ИЗ ЗАКАЗА ПРОДАЖИ Продавцом, SaleDate;
В этом примере сначала заказывает продавец, а затем — SaleDate. После того, как вы посмотрите данные в этом порядке, вы можете захотеть инвертировать их, как показано ниже:
ВЫБРАТЬ * ИЗ ЗАКАЗА ПРОДАЖ ПО Дата продажи, Продавец;
В этом примере строки сначала упорядочиваются по SaleDate, а затем по Salesperson.
Все эти примеры упорядочения расположены в порядке возрастания (ASC), который является порядком сортировки по умолчанию. Последний SELECT показывает сначала более ранние продажи — и в пределах заданной даты показывает продажи для «Adams» перед «Baker». Если вы предпочитаете порядок убывания (DESC), вы можете указать этот порядок для одного или нескольких столбцов порядка, как показано ниже:
ВЫБРАТЬ * ИЗ ПРОДАЖ ЗАКАЗАТЬ ПО Дата продажи DESC, ASC продавца;
В этом примере указывается порядок дат продаж по убыванию, показывая сначала самые последние продажи, и порядок возрастания для продавцов, располагая их в алфавитном порядке.Это должно дать вам лучшее представление о том, как Беннетт работает в сравнении с другими продавцами.
Об авторе книги
Аллен Дж. Тейлор — ветеран компьютерной индустрии с 30-летним стажем и автор более 40 книг, в том числе SQL для чайников, и Crystal Reports для чайников. Он читает лекции на национальном уровне по базам данных, инновациям и предпринимательству. Он также обучает разработке баз данных на международном уровне через ведущего поставщика онлайн-образования.
Group By, Have и Where в SQL
Введение
В этом блоге мы обсудим, как работать с предложениями GROUP BY, WHERE и HAVING в SQL, и объясним эту концепцию на примере в простой способ. Я надеюсь, что это будет очень полезно для новичков и среднего уровня, чтобы помочь им понять основную концепцию.
Группировать по пункту
Предложение Group by часто используется для упорядочивания идентичных повторяющихся данных в группы с помощью оператора select для группировки набора результатов по одному или нескольким столбцам.Это предложение работает с выбранным конкретным списком элементов, и мы можем использовать предложения HAVING и ORDER BY. Предложение Group by всегда работает с агрегатными функциями, такими как MAX, MIN, SUM, AVG, COUNT.
Давайте обсудим группировку по пунктам на примере. У нас есть таблица «Производство автомобилей», есть несколько моделей с ценой и некоторые повторяющиеся данные. Мы хотим отнести эти данные к другой группе с соответствующей общей ценой.
Пример
- Создать таблицу VehicleProduction
- (
- Id int primary key Identity,
- Model varchar (50),
- Price money
- )
- (вставить в L551 значения ‘, 850000), (‘ L551 ‘, 850000), (‘ L551 ‘, 850000), (‘ L551 ‘, 750000),
- (‘ L538 ‘, 650000), (‘ L538 ‘, 650000), (‘ L538 ‘, 550000), (‘ L530 ‘, 450000), (‘ L530 ‘, 350000), (‘ L545 ‘, 250000)
- Выберите * из VehicleProduction
MAX () — функция возвращает максимальное значение числового столбца указанного критерия.
Пример
- Выберите max (Price) как «MaximumCostOfModel» из VehicleProduction
Выход
MIN () — функция возвращает минимум числового столбца указанного критерия.
Пример
- Выберите Min (Price) As ‘MinimumCostOfModel’ из VehicleProduction
СУММ () — функция возвращает общую сумму числового столбца по заданным критериям.
Пример
- Выберите SUM (Price) как SumCostOfAllModel из VehicleProduction
Выход
AVG () — функция возвращает среднее значение числового столбца по заданным критериям.
Пример
- Выберите AVG (Цена) как «AverageCostOfModel» из VehicleProduction
COUNT () — функция возвращает количество строк, соответствующих заданным критериям.
Пример
- Выберите Count (Price) As ‘TotalVehicleModels’ из VehicleProduction
Предложение Distinct
Предложение отличное используется для фильтрации уникальных записей из повторяющихся записей, которые удовлетворяют критериям запроса.
Пример
- Select Distinct (модель), цена от автомобиля
Выход
Предложение Group by часто используется для упорядочивания идентичных повторяющихся данных в группы с помощью оператора select.Это предложение работает с выбранным конкретным списком элементов, для этого мы можем использовать предложения HAVING и ORDER BY.
Синтаксис
- ВЫБРАТЬ Column1, Column2
- FROM TableName
- GROUP BY Column1, Column2
Пример
- Выбрать * из серийного автомобиля
- Выбрать модель, цену из серийного автомобиля
- Группировать по модели, цене
Давайте посмотрим на пример GROUP BY с агрегатными функциями.
GROUP BY с агрегатными функциями
Пример
- Выберите модель, цену, количество (*) как QtyOfModel, Sum (Price) как TotPriceOfModel из VehicleProduction
- сгруппируйте по модели, цене
Выход
Предложение Where
Предложение Where работает с предложением select, но не работает с условием функции group by или агрегирования.
Пример 1
- Выберите модель, цену из VehicleProduction
- , где Model! = ‘L530’
- сгруппировать по модели, цене
Выход
Пример 2
Мы не можем использовать предложение where после группы по пункту
- Select Model, Price from VehicleProduction
- group by Model, Price
- where Model! = ‘L530’
Предложение Имея
Предложение Имея работает с предложением group by, но специально работает с условием агрегированной функции.
Пример
- Выберите модель, цену от автомобиля Производство
- Группировка по модели, цена
- Имея SUM (Price)> 600000.00
Предложение ORDER BY
Предложение Order By показывает записи в порядке возрастания или убывания конкретного условия.
Пример
- Выбор модели, цена от производства автомобиля
- Группа по моделям, цена
- Сумма (цена)> 400000.00
- заказать по цене по убыванию
Выход
Резюме
Я надеюсь, что вы понимаете концепцию, разместите свои отзывы, вопросы или комментарии об этом блоге и не стесняйтесь сообщать мне необходимые изменения в этой статье для улучшения качества контента.
SQL GROUP BY — Учебное пособие по SQL
Оператор SQL GROUP BY используется вместе с агрегатными функциями SQL, такими как
SUM для предоставления средств группировки набора данных результатов по определенной таблице базы данных
столбец (и).
Лучший способ объяснить, как и когда использовать оператор SQL GROUP BY , — это
пример, и это то, что мы собираемся делать.
Рассмотрим следующую таблицу базы данных под названием EmployeeHours, в которой хранятся ежедневные часы.
для каждого сотрудника фракционной компании:
Сотрудник | Дата | Часы |
Джон Смит | 06.05.2004 | 8 |
Аллан Бабель | 06.05.2004 | 8 |
Тина Краун | 06.05.2004 | 8 |
Джон Смит | 07.05.2004 | 9 |
Аллан Бабель | 07.05.2004 | 8 |
Тина Краун | 07.05.2004 | 10 |
Джон Смит | 08.05.2004 | 8 |
Аллан Бабель | 08.05.2004 | 8 |
Тина Краун | 08.05.2004 | 9 |
Если менеджер компании хочет получить простую сумму всех отработанных часов
для всех сотрудников ему необходимо выполнить следующий оператор SQL:
ВЫБЕРИТЕ СУММУ (часы) ОТ EmployeeHours |
Но что, если менеджер хочет получить сумму всех часов для каждого своего
сотрудники?
Для этого ему нужно изменить свой SQL-запрос и использовать оператор SQL GROUP BY :
ВЫБЕРИТЕ сотрудника, СУММА (часы) ОТ EmployeeHours ГРУППА ПО сотруднику |
Результатом приведенного выше выражения SQL будет следующий:
Сотрудник | Часы |
Джон Смит | 25 |
Аллан Бабель | 24 |
Тина Краун | 27 |
Как видите, у нас есть только одна запись для каждого сотрудника, потому что мы
группировка по столбцу Сотрудник.
Предложение SQL GROUP BY можно использовать с другими агрегатными функциями SQL для
пример SQL AVG:
ВЫБЕРИТЕ сотрудника, СРЕДНЕЕ (часы) ОТ EmployeeHours ГРУППА ПО сотруднику |
Результатом приведенного выше оператора SQL будет:
Сотрудник | Часы |
Джон Смит | 8.33 |
Аллан Бабель | 8 |
Тина Краун | 9 |
В нашей таблице сотрудников мы также можем сгруппировать по столбцу даты, чтобы узнать, что
общее количество часов, отработанных на каждую дату в таблице:
ВЫБЕРИТЕ дату, СУММУ (часы) ОТ EmployeeHours ГРУППА ПО ДАТЕ |
Вот результат приведенного выше выражения SQL:
Дата | Часы |
06.05.2004 | 24 |
07. |