Rollup group by sql: SQL Server ROLLUP By Practical Examples
Содержание
GROUP BY ROLLUP для анализа данных
Введение
В этой статье мы рассмотрим команды T-SQL GROUP BY ROLLUP для агрегирования данных и улучшения аналитических возможностей данных в SQL Server.
Во-первых, давайте посмотрим, какой пример набора данных мы собираемся использовать. Мы будем использовать представление vTargetMail и
Таблица DimGeograohy в образце базы данных AdventureWorksDW.
Давайте посмотрим на пример набора данных из следующего запроса.
1 2 3 4 5 6 | SELECT G.EnglishCountryRegionName ,G.StateProvinceName ,G.City ,M.[YearlyIncome] ИЗ [AdventureWorksDW2017].[dbo].[vTar getMail] M ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey |
В этом наборе данных у нас есть название региона, провинция и город в качестве столбцов меток, а годовой доход — в качестве столбца показателей.
как вы можете видеть из следующего рисунка.
GROUP BY — это очень распространенная функция агрегирования, которая использует простые агрегированные данные для предоставленных столбцов. Для
например, если мы хотим агрегировать вышеуказанный набор данных по названию региона, провинции и города, вы можете использовать GROUP BY
пункт следующим образом.
1 2 3 4 5 6 7 8 9 9 0005 10 11 12 | SELECT G.EnglishCountryRegionName ,G.StateProvinceName ,G.City ,SUM(M.[YearlyIncome]) TotalIncome ИЗ [AdventureWorksDW2017].[ dbo].[vTargetMail] M INNER JOIN [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey GROUP BY G.EnglishCountryRegionName ,G.StateProvinceName ,G.City ЗАКАЗ ПО G.EnglishCountryRegionName ,G. StateProvinceName ,G.City |
Ниже будет вывод для вышеуказанного запроса.
Вы увидите, что данные агрегированы для столбцов, предоставленных предложением GROUP BY. Важно отметить, что
данные не будут упорядочены в столбцах GROUP BY, и вам необходимо явно упорядочить их с помощью предложения ORDER BY
как показано в приведенном выше запросе.
В приведенном выше запросе, если вы хотите найти общую сумму только для Австралии, вам нужно запустить другую команду GROUP BY с
EnglishCountryRegionName и выполните UNION ALL. Это будет очень некрасивый метод. Используя GROUP BY ROLLUP, вы можете выполнить указанную выше задачу, как показано в следующем запросе.
1 2 3 4 5 6 7 | SELECT G.EnglishCountryRegionName ,G.StateProvinceName ,G.City ,SUM(M.[YearlyIncome]) TotalIncome ИЗ [AdventureWorksDW2017]. [ dbo].[vTargetMail] M ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey ГРУППИРОВАТЬ ПО ОБЪЕМУ (G.EnglishCountryRegionName, G.StateProvinceName, G.City) |
Вывод вышеуказанного запроса имеет два преимущества, которых не было в параметре GROUP BY.
Во-первых, выходные данные будут отсортированы по столбцам, указанным в операторе GROUP BY ROLLUP. Помимо порядка, у вас также есть агрегация для различных комбинаций. Как мы заметили в операторе GROUP BY,
все данные агрегируются во все три столбца. Однако с оператором GROUP BY ROLLUP будет много агрегаций. Например, в приведенном выше выводе строка 32 агрегирована с Австралией, Южной Австралией, а строка 34 агрегирована с Австралией и Тасманией, а строка номер 45 агрегирована с Австралией.
Помимо простой агрегации, в GROUP BY ROLLUP доступно несколько функций.
ГРУППИРОВКА
Используя функцию GROUPING, вы можете узнать, какие столбцы используются для агрегирования.
1 2 3 4 5 6 7 8 9 9 0005 10 | SELECT ISNULL(G.EnglishCountryRegionName, ‘ALL’) CountryRegion ,ISNULL(G.StateProvinceName, ‘ALL’) StateProvinceName ,ISNULL(G.City, ‘ALL’) City ,SUM(M.[YearlyIncome]) TotalIncome ,GROUPING(G.EnglishCountryRegion Name) IsEnglishCountryRegionNameGrouping ,GROUPING(G.StateProvinceName) IsStateProvinceNameGrouping ,GROUPING(G.City) IsCityGrouping FROM [AdventureWorksDW2017].[dbo].[vTargetMail] M 9 0005 ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey ГРУППА ПО ОБЪЕМУ (G.EnglishCountryRegionName, G.StateProvinceName, G.City) |
Помимо функции GROUPING, мы использовали функцию ISNULL, чтобы заменить значения NULL на ALL.
В строке 108 значение City заменено ВСЕМИ значениями в столбце isCityGrouping, показанном как 1, чтобы указать, что столбец City является агрегированным.
Вы можете использовать функцию GROUPING в предложении HAVING в GROUP BY ROLLUP, как показано в приведенном ниже запросе.
1 2 3 4 5 6 7 8 9 9 0005 10 | SELECT ISNULL(G.EnglishCountryRegionName, ‘ALL’) CountryRegion ,ISNULL(G.StateProvinceName, ‘ALL’) StateProvinceName ,ISNULL(G.City, ‘ALL’) City ,SUM(M. [Годовой доход]) Общий доход ОТ [AdventureWorksDW2017].[dbo].[vTargetMail] M INNER JOIN [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey GROUP BY ROLLUP(G.EnglishCountryRegionName, G.StateProvinceName, G.City) HAVING GROUPING(G.EnglishCountryRegionName) = 1 9000 5 ИЛИ ГРУППА(G.StateProvinceName) = 1 ИЛИ ГРУППА(G.City) = 1 |
Приведенный выше запрос предоставит вам только агрегированные столбцы, а стандартные значения GROUP BY игнорируются.
Если в исходных значениях есть значения NULL, будут проблемы с функцией ISNULL. Следовательно
следует использовать разные методы, и в следующем запросе функции CASE и ISNULL используются вместе для достижения
этот.
1 2 3 4 5 6 7 8 9 9 0005 10 11 12 13 14 15 16 17 18 19 | SELECT CASE WHEN GROUPING(G.EnglishCountryRegionName) = 1 THEN ‘ALL’ ELSE ISNULL(G.EnglishCountryRegionName, ‘UNKNOWN’) END CountryRegion ,CASE WHEN GROUPING(G.StateProvinceName) = 1 THEN ‘ALL’ ELSE ISNULL (G.StateProvinceName, ‘НЕИЗВЕСТНО’) END StateProvinceName ,CASE WHEN GROUPING(G.City) = 1 THEN ‘ALL’ ELSE ISNULL(G. City, ‘UNKNOWN’) END City ,SUM(M.[YearlyIncome]) TotalIncome FROM [AdventureWorksDW2017].[dbo].[vTargetMail] M INNER JOIN [dbo].[ DimGeography] G ON m.GeographyKey = G.GeographyKey GROUP BY ROLLUP(G.EnglishCountryRegionName, G.StateProvinceName, G.City) |
В приведенном выше запросе функция ISNULL используется для отображения UNKNOWN для значений NULL, а функция GROUPING используется для отображения ALL для совокупных столбцов. Поскольку в выбранном наборе данных нет значений NULL, не будет никакой разницы с тем выходом, который вы наблюдали ранее.
Функция КУБ
Вместо функции GROUP BY ROLLUP мы можем использовать функцию GROUP BY CUBE для получения другого вывода. В ROLLUP агрегат выполняется в порядке предоставленных столбцов. Функция КУБ агрегирует все комбинации.
Давайте объединим функции КУБ и ГРУППИРОВКА, как показано в приведенном ниже запросе.
1 2 3 4 5 6 7 8 9 9 0005 10 11 12 13 14 15 16 17 9000 5 18 19 20 21 22 | SELECT CASE WHEN GROUPING(G. EnglishCountryRegionName) = 1 THEN ‘ALL’ ELSE ISNULL(G.EnglishCountryRegionName, ‘UNKNOWN’) END CountryRegion ,CASE WHEN GROUPING(G.StateProvinceName) = 1 THEN ‘ALL’ ELSE ISNULL(G.StateProvin ceName, ‘UNKNOWN’) END StateProvinceName ,CASE WHEN GROUPING(G.City) = 1 THEN ‘ALL’ ELSE ISNULL(G.City, ‘UNKNOWN’) END City ,SUM(M.[YearlyIncome]) TotalIncome FROM [AdventureWorksDW2017].[dbo].[vTarget Mail] M INNER JOIN [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey GROUP BY CUBE(G.EnglishCountryRegionName, G.StateProvinceName, G.City) HAVING GROUPING(G.EnglishCountryRegionName) = 1 ИЛИ ГРУППИРОВКА(G.StateProvinceName) = 1 ИЛИ ГРУППИРОВКА(G.City) = 1 |
Результат вышеуказанного запроса показан ниже.
НАБОРЫ ДЛЯ ГРУППИРОВАНИЯ
Предложения GROUP BY ROLLUP и GROUP BY CUBE предоставляют различные комбинации агрегированных столбцов. Однако,
большинство этих комбинаций не будут полезны разработчикам. GROUPING SETS предоставит вам возможность управления агрегатами.
1 2 3 4 5 6 7 8 9 10 900 04 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | SELECT CASE WHEN GROUPING(G.EnglishCountryRegionName) = 1 THEN ‘ALL’ ELSE ISNULL(G.EnglishCountryRegionName, ‘UNKNOWN’) END CountryRegion ,CASE WHEN GROUPING(G.StateProvinceName) = 1 THEN ‘ALL’ ELSE ISNULL(G.StateProvinceName, ‘UNKNOWN’) END StateProvinceName ,CASE WHEN GROUPING(G.City) = 1 THEN ‘ALL’ ELSE ISNULL(G. City, ‘UNKNOWN’) END City ,SUM(M.[Годовой доход]) Общий доход ОТ [AdventureWorksDW2017].[dbo].[vTargetMail] M ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo].[DimGeography] G ON m.GeographyKey = G.GeographyKey 9 0004 GROUP BY GROUPING SETS(( G.EnglishCountryRegionName ,G.StateProvinceName ,G.City ), ( G.EnglishCountryRegionName ,G.City ), () ) |
В комбинациях GROUPING SETS предусмотрено четыре комбинации. Подобно ROLLUP и CUBE, его можно использовать
GROUPING для команды GROUPING SETS.
Заключение
Агрегация используется для анализа данных в аналитической системе. Традиционно GROUP BY используется для агрегирования данных.
Однако ROLLUP, CUBE и GROUPING SETS используются для возврата разных совокупных значений. ROLLUP обеспечит агрегацию в указанном порядке столбцов, в то время как CUBE предоставит различные комбинации предоставленных столбцов, а GROUPING SETS имеет возможность агрегации в индивидуальном порядке. Используя функцию GROUPING, можно получить дополнительные параметры для вышеуказанных функций.
- Автор
- Последние сообщения
Динеш Асанка
Динеш Асанка является MVP в категории SQL Server за последние 8 лет. Работает с SQL Server более 15 лет, пишет статьи и книги в соавторстве. Он является ведущим в различных группах пользователей и университетах. Он всегда готов учиться и делиться своими знаниями.
Просмотреть все сообщения Динеша Асанки
Последние сообщения Динеша Асанки (посмотреть все)
SQL Rollup — Scaler Topics
Учебник по SQL
Сводка по SQL
Сводка по SQL
share-outline Курс по СУБД — Освоение основ и расширенных концепций
Шрикант Варма
Бесплатно
Зарегистрировано:
1000
Курс по СУБД — Освоение основ и расширенных концепций
Шрикант Варма
Бесплатно
Начать обучение
Обзор
ROLLUP в SQL является расширением предложения GROUP BY. Этот параметр SQL ROLLUP позволяет пользователю включать дополнительные строки, представляющие промежуточные итоги, которые обычно называются строками суперагрегатов, вместе с общая сумма строк .
Знакомство с SQL ROLLUP
Мы можем использовать параметр SQL ROLLUP для создания нескольких группирующих наборов с помощью одного запроса. ROLLUP в SQL — это подпункт предложения GROUP BY, который обеспечивает сокращение для определения нескольких наборов группировок. Набор для группировки — это набор столбцов, которые мы можем использовать для выполнения операции GROUP BY .
При создании наборов для группировки SQL ROLLUP предполагает наличие иерархии среди столбцов и создает наборы для группировки только на основе этой иерархии. ROLLUP в SQL обычно используется для вычисления агрегатов иерархических данных, таких как продажи за год > квартал > месяц.
Уровни агрегирования
Если n — количество группируемых столбцов, то ROLLUP создает n+1 уровней промежуточных и общих итогов. Поскольку ROLLUP удаляет крайний правый столбец на каждом шаге, порядок столбцов необходимо указывать тщательно.
Например —
ROLLUP(A, B, C) создает четыре группы, предполагая иерархию A > B > C, следующим образом:
ROLLUP удаляет крайний правый столбец на каждом шаге. Для (A, C) и (B, C) групп нет.
Синтаксис
Приведенный ниже пример иллюстрирует основной раздел SQL ROLLUP.
В приведенном выше синтаксисе входной столбец имеет вид (col1,col2) , имеющий иерархию col1 > col2 . SQL ROLLUP генерирует все наборы группировок с учетом этой иерархии. По этой причине мы часто используем ROLLUP для получения промежуточных итогов и общего итога 9.0636 для отчетности.
Параметры
group‑expression — Предложение SQL ROLLUP принимает в качестве параметра любое выражение, не являющееся агрегатом или функцией группирования, которое включает константы и ссылки на столбцы в таблицах , указанных FROM.
Ограничения
GROUP BY ROLLUP не сортирует полученные результаты. Для сортировки данных предложение ORDER BY должно следовать за предложением GROUP BY.
Пример
Агрегирование полного набора данных
Рассмотрим таблицу «Сотрудники», в которой указана заработная плата сотрудников многонациональной компании. Таблица содержит идентификатор , имя, пол, зарплату и страну в качестве полей.
ID Имя Пол Зарплата Страна 1 Ясень Наружная резьба 5000 США 2 Джеймс Мужчина 4500 Индия 3 Нэнси Женщина 5500 90 025 США 4 Сара Женщина 4000 Индия 5 9002 5 Томас Мужчина 3500 Индия 6 Мари Женщина 5000 9 0025 Великобритания 7 Бенджамин Мужчина 6500 Великобритания 8 Элиза Женщина 900 25 7000 США 9 Гэри Мужчина 5500 Великобритания 9 0011
10 Кори Мужчина 5000 США Использование приведенного выше запроса GROUP BY вместе с параметром ROLLUP помогает нам сгруппировать зарплату по стране и полу. ROLLUP в SQL также вычисляет промежуточный итог на уровне страны и общий итог .
Вывод:
Страна Пол Общая зарплата Индия Женщина 9002 6 4000
Индия Мужской 8000 Индия NULL 12000 9002 5 Великобритания Женский 5000 Великобритания Мужской 12000 Великобритания NULL 17000 США 90 NULL 22500 NULL NULL 51500 Использование SQL ROLLUP с пунктом HAVING
Используя приведенный выше пример таблицы Employees, мы можем узнать, как использовать предложение HAVING с ROLLUP для ограничения результатов GROUP BY.
Следующий запрос использует функцию GROUPING, принимая одно из выражений GROUP BY в качестве аргумента. Для каждой строки GROUPING возвращает одно из следующих значений :
.
- 0: столбец является частью группы для этой строки
- 1: столбец не входит в группу для этой строки
Следующий запрос выдает только те категории ROLLUP, в которых только столбец Gender имеет значение с промежуточным итогом на основе выражения в функции GROUPING.
Вывод:
Страна Пол Общая зарплата Индия NULL 900 26 12000
Великобритания NULL 17000 США NULL 22500 NULL NULL 51500 Как выполнить частичный SQL ROLLUP?
Мы часто используем ROLLUP в SQL для выполнения частичного сведения, которое уменьшает число вычисленных промежуточных итогов , как показано в следующем примере.
Используя приведенную выше таблицу «Сотрудники», мы можем попробовать выполнить частичный ROLLUP, создав сверхагрегированную сводку для столбца «Пол», а не для столбца «Страна».
Вывод:
Страна Пол Общая зарплата Индия Женщина 4000 Индия Мужчина 8000 Индия NULL 12000 Великобритания Женщина 5000 Великобритания 9002 6 Мужской
12000 Великобритания NULL 17000 США Женский 9 0026 12500
США Мужской 10000 США NULL 22500
Заключение
- ROLLUP в агрегации SQL используется для выполнения нескольких уровней анализа с помощью одного запроса.