Sql группировка: Оператор SQL GROUP BY: синтаксис, примеры
Содержание
Группирование строк в результатах запроса — Visual Database Tools
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
-
Применимо к:SQL Server
Если нужно создать подытог или отобразить другие сводные сведения о подмножествах таблицы, создайте группы, используя статистический запрос. Каждая такая группа обобщает данные всех строк таблицы, имеющих одно и то же значение.
Например, нужно узнать среднюю стоимость книг, данные о которых хранятся в таблице titles
, и разделить результаты в соответствии с идентификаторами издателей. Для этого следует сгруппировать запрос на основе идентификатора издателя (например pub_id
). Сведения, выведенные таким запросом, могли бы выглядеть следующим образом:
Группируя данные, можно отобразить только сводные или сгруппированные данные, подобные следующим.
Значения сгруппированных столбцов (столбцов, указанных в предложении GROUP BY). В приведенном выше примере столбец
pub_id
является сгруппированным.Значения, созданные агрегатными функциями, такими как SUM( ) и AVG( ). В приведенном выше примере второй столбец создается путем применения функции AVG( ) к столбцу
price
.
Отобразить значения отдельных строк нельзя. Например, если группируются данные только по идентификаторам издателей, нельзя отобразить в запросе еще и отдельные названия книг. Таким образом, если столбцы добавляются в вывод запроса, конструктор запросов и представлений автоматически добавляет их в предложение GROUP BY инструкции на панели SQL. Если нужно, чтобы столбец содержал статистические данные, можете определить для него агрегатную функцию.
Если данные группируются по нескольким столбцам, каждая группа в запросе отображает статистические значения всех столбцов группировки.
Например, следующий запрос таблицы titles
группирует данные по идентификаторам издателей (pub_id
) и типам книг (type
). Результаты запроса упорядочиваются по идентификаторам издателей и представляют сводные данные о каждом типе книг, издаваемых издателем:
SELECT pub_id, type, SUM(price) Total_price FROM titles GROUP BY pub_id, type
Итоговый вывод мог бы выглядеть следующим образом:
Группирование строк
Инициируйте запрос, добавив таблицы, сводную информацию о которых нужно получить, на панель диаграмм.
Щелкните правой кнопкой мыши фон панели диаграммы и выберите из контекстного меню пункт Добавить Group By . Конструктор запросов и представлений добавляет столбец Группировать в сетку на панели критериев.
Добавьте столбец или столбцы, которые нужно сгруппировать, на панель критериев. Если нужно, чтобы столбец был отображен в выводе запроса, не забудьте убедиться в том, что для вывода выбран столбец Вывод .
Конструктор запросов и представлений добавит в инструкцию, отображаемую на панели SQL, предложение GROUP BY. Например, инструкция SQL может иметь такой вид:
SELECT pub_id FROM titles GROUP BY pub_id
Добавьте на панель критериев столбец или столбцы, статистическую информацию о которых нужно получить. Убедитесь, что столбец помечен для вывода.
В ячейке Группировать для столбца, статистическую информацию о котором нужно получить, выберите подходящую агрегатную функцию.
Конструктор запросов и представлений автоматически назначает суммируемому столбцу псевдоним, Псевдоним, созданный автоматически, можно заменить более содержательным псевдонимом. Дополнительные сведения см. в статье о создании псевдонимов столбцов.
Соответствующая инструкция могла бы выглядеть на панели SQL следующим образом:
SELECT pub_id, SUM(price) AS Totalprice FROM titles GROUP BY pub_id
Сортировка и группировка результатов запроса
Группировка (GROUP) | Основы реляционных баз данных
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
С агрегатными функциями связано множество разных задач. Например, они помогают вывести общее число топиков для каждого пользователя. Так это может выглядеть:
SELECT COUNT(*) FROM topics WHERE user_id = 3; SELECT COUNT(*) FROM topics WHERE user_id = 4; -- . ..
При этом здесь мы сталкиваемся с одной сложностью — невозможно выполнить данную задачу за один запрос, используя только функции. Нам придется делать выборку для каждой категории индивидуально, а это долго и неудобно. Если пользователей тысячи, то такое решение вопроса неприемлемо в принципе.
Подобные задачи возникают настолько часто, что для них существует специальная форма GROUP BY
. В этом уроке мы изучим, как работает эта функция.
GROUP BY
Эта функция группирует строки по определенному признаку и выполняет подсчеты внутри каждой группы независимо от других групп:
SELECT user_id, COUNT(*) FROM topics GROUP BY user_id; user_id | count ---------+------- 71 | 1 80 | 1 84 | 3 92 | 1 60 | 1 97 | 2 98 | 1 44 | 1 40 | 1 43 | 1
В запросе выше мы создали группы записей по значению поля user_id
. Эти данные можно представить себе как набор виртуальных таблиц, каждая из которых содержит все записи по одному пользователю. Подсчет количества идет по каждому пользователю независимо от других. К результатам такой выборки можно применять сортировку и лимитирование:
SELECT user_id, COUNT(*) FROM topics GROUP BY user_id ORDER BY count DESC LIMIT 3; user_id | count ---------+------- 84 | 3 97 | 2 57 | 2
С помощью сортировки мы можем обращаться не только к полям самой таблицы, но и к вычисленному значению. По умолчанию имя этого виртуального поля совпадает с именем функции, но его можно изменить с помощью механизма псевдонимов:
SELECT user_id, COUNT(*) AS topics_count FROM topics GROUP BY user_id ORDER BY topics_count DESC LIMIT 3;
Псевдонимы создаются не только для агрегатных значений, но и для любых имен в запросе. Переименовываются даже существующие поля. Общая структура имени выглядит так: <expression> AS <name>
.
У псевдонимов есть одно удобное свойство. Если определить их в одном месте, они становятся доступны в других частях SQL-запроса:
SELECT first_name AS name FROM users ORDER BY name;
Теперь попытаемся выполнить следующий запрос:
SELECT user_id, created_at, COUNT(*) AS topics_count FROM topics GROUP BY user_id;
Запрос завершится с ошибкой:
ERROR: column "topics. created_at" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT user_id, created_at, COUNT(*) AS topics_count FROM topics G...
Чтобы лучше понять работу GROUP BY
, разберемся, почему запрос выше не сработает.
Дело в том, что группировка обращается к записям в таблице и создает из них независимые группы записей, по которым проводится анализ.
Группа записей — не то же самое, что одна запись. Мы не можем просто взять и указать имя любого поля — база данных сама не выберет какое-то значение из этой группы. Такое поведение создает неоднозначность и не несет в себе смысла.
СУБД отслеживает такие ошибки и просит выполнить одно из двух действий:
Действие 1 — указать поле created_at
в выражении GROUP BY
. Тогда значение поля для каждой записи из группы будет одинаковым — в этом и суть группировки. Значит, СУБД однозначно определит, что нужно добавить в результат:
SELECT user_id, created_at, COUNT(*) AS topics_count FROM topics GROUP BY user_id, created_at; user_id | created_at | topics_count ---------+-------------------------+-------------- 40 | 2018-12-05 18:40:05. 603 | 1 67 | 2018-12-06 05:23:40.65 | 1
Такой запрос выполнит группировку сначала по user_id
, а затем по дате создания. Даты создания у всех топиков почти наверняка уникальны, поэтому вся таблица разобьется на группы по одному элементу. Смысла в таком запросе не очень много, гораздо полезнее сделать то же самое с разбивкой по дням или месяцам. Тогда можно будет увидеть, сколько топиков создает конкретный пользователь каждый день:
-- В этом запросе используется функция EXTRACT, -- которая извлекает значения из даты: например, номер дня или месяца SELECT user_id, EXTRACT(day from created_at) AS day, COUNT(*) AS topics_count FROM topics GROUP BY user_id, day ORDER BY user_id; user_id | day | topics_count --------+-----+-------------- 1 | 5 | 1 1 | 6 | 1 4 | 6 | 1 6 | 5 | 1 7 | 6 | 2 8 | 5 | 1 9 | 6 | 1
Действие 2 — использовать created_at
внутри агрегатной функции. В таком случае мы получим результат на основе анализа всех значений в рамках группы. Например, добавление вызова MAX(created_at)
посчитает дату последнего добавленного топика для каждой группы:
SELECT user_id, MAX(created_at), COUNT(*) AS topics_count FROM topics GROUP BY user_id; user_id | max | topics_count --------+-------------------------+-------------- 40 | 2018-12-05 18:40:05.603 | 1 67 | 2018-12-06 05:23:40.65 | 1 49 | 2018-12-06 14:55:08.99 | 1 43 | 2018-12-06 00:20:11.835 | 1
HAVING
Иногда встречаются более сложные ситуации, в которых нужно проводить анализ только по некоторым группам. Предположим, что мы хотим выбрать всех пользователей, у которых количество топиков больше одного. Эта задача сводится к поиску групп, в которых более одной записи.
Подобный запрос невозможно сделать через WHERE
, потому что эти условия применяются к записям исходной выборки, еще до создания самих групп.
В этой задаче понадобится дополнение к GROUP BY
, которое называется HAVING
:
SELECT user_id, COUNT(*) FROM topics GROUP BY user_id HAVING COUNT(*) > 1; user_id | count ---------+------- 84 | 3 97 | 2 57 | 2 30 | 2 83 | 2 7 | 2 38 | 2 1 | 2 (8 rows)
Подчеркнем, что HAVING
нужен для отбора групп по какому-то агрегатному признаку — например, количеству записей в группе. Если вам надо посмотреть значение конкретного поля, используйте именно WHERE
.
Группировка — это мощный, но в то же время сложный инструмент, который помогает анализировать данные в таблицах. Не заморачивайтесь над тем, чтобы выучить группировку от и до прямо сейчас. Опытные разработчики пользуются ей не каждый день и сами постоянно подсматривают в документацию.
Важно понимать спектр задач, для которых группировка подходит, а остальное — дело техники и умения читать документацию. Это общее правило, характерное и для многих других аспектов баз данных.
ГРУППИРОВКА (Transact-SQL) — SQL Server
Редактировать
Твиттер
Фейсбук
Электронная почта
- Статья
Применяется к: SQL Server База данных SQL Azure Azure SQL Управляемый экземпляр Azure Synapse Analytics Конечная точка SQL в Microsoft Fabric Warehouse в Microsoft Fabric
Указывает, является ли указанное выражение столбца в списке GROUP BY агрегированным или нет. GROUPING возвращает 1 для агрегирования или 0 для отсутствия агрегирования в результирующем наборе. GROUPING можно использовать только в предложениях SELECT
Соглашения о синтаксисе Transact-SQL
Синтаксис
ГРУППИРОВКА ()
Примечание
Чтобы просмотреть синтаксис Transact-SQL для SQL Server 2014 и более ранних версий, см. документацию по предыдущим версиям.
Аргументы
<выражение_столбца>
Столбец или выражение, которое содержит столбец в предложении GROUP BY.
Типы возвращаемых значений
tinyint
ГРУППИРОВКА используется для того, чтобы отличить нулевые значения, возвращаемые функциями ROLLUP, CUBE или GROUPING SETS, от стандартных нулевых значений. NULL, возвращаемый в результате операции ROLLUP, CUBE или GROUPING SETS, является особым использованием NULL. Это действует как заполнитель столбца в наборе результатов и означает все.
Примеры
Следующий пример группирует SalesQuota
и суммирует SalesYTD
сумм в базе данных AdventureWorks2022. Функция GROUPING
применяется к столбцу SalesQuota
.
SELECT SalesQuota, SUM(SalesYTD) 'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping' ОТ Sales.SalesPerson ГРУППИРОВАТЬ ПО SalesQuota С ОБЪЕДИНЕНИЕМ; ИДТИ
В наборе результатов показаны два нулевых значения под SalesQuota
. Первый NULL
представляет группу нулевых значений из этого столбца в таблице. Второй NULL
находится в итоговой строке, добавленной операцией ROLLUP. В итоговой строке показаны суммы TotalSalesYTD
для всех групп SalesQuota
, которые обозначены как 1
в столбце Grouping
.
Вот набор результатов.
SalesQuota TotalSalesYTD Группировка --------------------------- ------------------ -------- НУЛЕВОЙ 1533087,5999 0 250000,00 33461260,59 0 300000,00 9299677,9445 0 НУЛЕВОЙ 44294026.1344 1 (затронуты 4 строки)
См. также
GROUPING_ID (Transact-SQL)
GROUP BY (Transact-SQL)
Группировка по нескольким столбцам в SQL
Обзор
Чтобы упорядочить идентичные данные в группы, мы используем предложение SQL group by. Предложение SQL group by single column помещает все записи, имеющие одинаковое значение только определенного столбца, в одну группу. Метод группировки по нескольким столбцам извлекает значения сгруппированных столбцов из одной или нескольких таблиц базы данных, рассматривая более одного столбца в качестве критериев группирования.
Scope
Статья содержит такие темы, как
- Группировать по одному столбцу с использованием функций агрегирования.
- Группировать по нескольким столбцам, использование группировки по нескольким столбцам.
Каждая из тем четко объяснена с диаграммами и примерами, где это необходимо.
Группировать по одному столбцу
Чтобы упорядочить похожие (идентичные) данные в группы, мы используем предложение SQL GROUP BY. Предложение SQL GROUP BY используется вместе с некоторыми агрегатными функциями для группировки столбцов с одинаковыми значениями в разных строках. Обычно мы используем предложение GROUP BY с оператором SELECT, предложением WHERE и предложением ORDER BY.
Группировка по одному столбцу помещает все записи (строки), имеющие одинаковое значение только определенного столбца, в одну группу.
Синтаксис
Обратитесь к изображению ниже, чтобы визуализировать группировку.
На изображении выше мы сгруппировали похожие данные.
Пример
Предположим, мы работаем с базой данных компании. У нас есть две таблицы, а именно сотрудник и отдел . Таблица сотрудников имеет три столбца, а именно идентификатор сотрудника , зарплата и идентификатор отдела . В таблице отделов есть два столбца, а именно ИД_отдела и имя_отдела . Давайте попробуем сгруппировать сотрудников, присутствующих в таблице сотрудников, на основе их идентификатора_отдела.
таблица сотрудников:
ID сотрудника | зарплата | ID отдела |
---|---|---|
100 | 24000 90 155 | 1 |
101 | 17000 | 1 |
103 | 10000 | 1 90 155 |
104 | 9000 | 2 |
105 | 11000 | 2 |
106 | 16000 | 3 |
Стол отдела:
ID_отдела | Название_отдела |
---|---|
1 | Бухгалтерия |
1 | Маркетинг |
2 | ИТ |
Запрос:
Вывод:
зарплата | ID отдела |
---|---|
51000 | 1 |
2 | |
16000 | 3 |
Группировка по нескольким столбцам
Метод группировки по нескольким столбцам извлекает значения сгруппированных столбцов из одной или нескольких таблиц базы данных, рассматривая несколько столбцов в качестве критериев группирования. Мы используем SQL-запросы для группировки нескольких столбцов базы данных.
Группировка по нескольким столбцам используется для объединения различных записей с похожими (или одинаковыми) значениями для указанных столбцов. Всякий раз, когда мы выполняем группировку по нескольким столбцам (группировка, определенная для нескольких столбцов), все значения этих столбцов должны быть такими же, как и у других столбцов, чтобы их можно было рассматривать для группировки в одну запись.
Мы используем предложение GROUP BY для реализации группировки по нескольким столбцам.
Синтаксис предложения GROUP BY довольно прост.
Синтаксис
В приведенном выше синтаксисе мы сначала предоставляем имена столбцов (столбец_1, столбец_2,…, столбец_n) таблицы, из которой мы хотим получить результаты. После столбцов мы указываем имя целевой таблицы (таблица, из которой должен быть получен результат). Наконец, мы можем указать некоторые условия для определенных столбцов, используя предложение WHERE.
Мы можем указать критерии для одного или нескольких столбцов (например, column_1_criteria, column_2_criteria,…, column_n_criteria). Мы также можем предоставить выражения в качестве критериев группировки.
Использование группы по нескольким столбцам
Давайте обсудим некоторые аспекты использования и преимущества использования группы по нескольким столбцам:
- Мы можем использовать группу по нескольким столбцам для
группировать несколько записей в одну запись. - Все записи с одинаковыми значениями соответствующих столбцов, упомянутых в критериях группировки, могут быть сгруппированы в один столбец с использованием метода группировки по нескольким столбцам.
- Группировка по нескольким столбцам используется для получения сводных данных из таблиц базы данных.
- Группировка по нескольким столбцам часто используется для формирования запросов к отчетам.
Примеры
Теперь давайте рассмотрим несколько примеров групп по нескольким столбцам, чтобы лучше понять тему.
Группировка по двум столбцам и поиск среднего
Предположим, мы работаем с базой данных компании. У нас есть две таблицы, а именно сотрудник и отдел . Таблица сотрудников имеет три столбца, а именно employee_ID , зарплата , Department_id . В таблице отделов есть два столбца, а именно id_отдела и имя_отдела . Попробуем найти среднюю заработную плату сотрудников в каждом отделе.
таблица сотрудников:
ID сотрудника | зарплата | ID отдела |
---|---|---|
100 | 24000 | 1 |
101 | 17000 | 1 |
103 | 1 | |
104 | 9000 | 2 |
105 | 11000 | 2 |
106 | 16000 | 3 |
стол отдела:
ID_отдела | Название_отдела |
---|---|
1 | Бухгалтерия |
1 | Маркетинг |
2 | IT |
Запрос:
Вывод:
В приведенном выше запросе мы объединили отдел и сотрудника таблицу и выбрал идентификатор отдела , название отдела и среднюю зарплату . . Средняя заработная плата рассчитывается путем группировки сотрудников на основе их отдела.
Группировка по двум столбцам и поиск нескольких статистических данных
Мы видели группировку сотрудников по одному столбцу. Давайте теперь научимся группировать по нескольким столбцам.
Рассмотрим тот же отдел и сотрудник таблицу. Таблица сотрудников состоит из четырех столбцов, а именно: employee_ID , зарплата , Department_id и job_id . В таблице отделов есть два столбца, а именно id_отдела и имя_отдела . У нас есть еще одна таблица с именем job , в которой хранится job_id и имя задания .
Попробуем сгруппировать по идентификатору сотрудника и идентификатору сотрудника.
Таблица сотрудников:
идентификатор_сотрудника | зарплата | идентификатор_отдела | идентификатор_задания |
---|---|---|---|
100 | 24000 | 1 | 1 |
101 | 17000 | 1 | 1 |
103 | 10000 | 1 | 1 |
104 | 9000 | 2 | 3 90 155 |
105 | 11000 | 2 | 3 |
106 | 16000 | 2 |
Стол отдела:
ID_отдела | Название_отдела |
---|---|
1 | Счета |
ИТ | |
3 | Маркетинг |
Рабочий стол:
job_ID | job_title |
---|---|
1 | Бухгалтер |
Менеджер | |
3 | Отдел кадров |
Запрос:
90 017 Выход:
идентификатор_отдела | имя_отдела | идентификатор_задания | COUNT(e. employee_ID) |
---|---|---|---|
1 | Бухгалтерия | 1 | 3 |
2 | IT 901 55 | 3 | 2 |
3 | Маркетинг | 2 | 1 |
9 0016 Вывод (как указано выше) генерируется с помощью операции соединения трех таблиц. После операции соединения добавляется условие GROUP BY. Мы также добавили агрегатную функцию подсчета в столбце идентификатора сотрудника.
Заключение
- Чтобы организовать похожие (идентичные) данные в группы, мы используем предложение SQL group by. Предложение GROUP BY используется вместе с некоторыми агрегатными функциями для группировки столбцов с одинаковыми значениями в разных строках.
- Метод группировки по нескольким столбцам извлекает значения сгруппированных столбцов из одной или нескольких таблиц базы данных, рассматривая несколько столбцов в качестве критериев группирования.
- Все записи с одинаковыми значениями соответствующих столбцов, упомянутых в критериях группировки, могут быть сгруппированы в один столбец с использованием метода группировки по нескольким столбцам.