В этом руководстве вы узнаете, как использовать SQL Server ROLLUP для создания нескольких группировочных наборов.
Введение в SQL Server ROLLUP
SQL Server ROLLUP — это подпункт предложения GROUP BY, который обеспечивает сокращение для определения нескольких наборов группировки.
В отличие от подпункта CUBE, ROLLUP не создает все возможные наборы группировки на основе столбцов измерений; CUBE создает подмножество из них.
При создании наборов группировки ROLLUP предполагает наличие иерархии среди столбцов измерений и создает наборы группировки только на основе этой иерархии.
Функция ROLLUP часто используется для расчета промежуточных и итоговых сумм в целях составления отчетов.
Давайте рассмотрим пример. Следующий КУБ(d1,d2,d3) определяет восемь возможных группирующих наборов:
(d1, d2, d3) (d1, d2) (d2, d3) (d1, d3) (d1) (d2) (d3) ()
А ROLLUP(d1,d2,d3) создает только четыре группирующих набора, предполагая иерархию d1 > d2 > d3, как показано ниже:
(d1, d2, d3) (d1, d2) (d1) ()
Функция ROLLUP обычно используется для расчета агрегатов иерархических данных, таких как продажи по годам > кварталам > месяцам.
Синтаксис SQL Server ROLLUP
Общий синтаксис SQL Server ROLLUP выглядит следующим образом:
SELECT
d1,
d2,
d3,
aggregate_function(c4)
FROM
table_name
GROUP BY
ROLLUP(d1, d2, d3);
В этом синтаксисе d1, d2 и d3 являются столбцами измерений. Оператор вычислит агрегацию значений в столбце c4 на основе иерархии d1 > d2 > d3.
Вы также можете выполнить частичное свертывание, чтобы сократить генерируемые промежуточные итоги, используя следующий синтаксис:
SELECT
d1,
d2,
d3,
aggregate_function(c4)
FROM
table_name
GROUP BY
d1,
ROLLUP(d2, d3);
Примеры SQL Server ROLLUP
Мы повторно используем таблицу sales.sales_summary, созданную в руководстве GROUPING SETS для демонстрации. Если вы не создали таблицу sales.sales_summary, вы можете использовать следующий оператор для ее создания.
SELECT
b.brand_name AS brand,
c.category_name AS category,
p.model_year,
round(
SUM(
quantity * i.list_price *(1 - discount)
),
0
) sales INTO sales.sales_summary
FROM
sales.order_items i
INNER JOIN production.products p ON p.product_id = i.product_id
INNER JOIN production.brands b ON b.brand_id = p.brand_id
INNER JOIN production.categories c ON c.category_id = p.category_id
GROUP BY
b.brand_name,
c.category_name,
p.model_year
ORDER BY
b.brand_name,
c.category_name,
p.model_year;
Следующий запрос использует функцию ROLLUP для расчета объема продаж по бренду(промежуточный итог), а также по бренду и категории(общий итог).
SELECT
brand,
category,
SUM(sales) sales
FROM
sales.sales_summary
GROUP BY
ROLLUP(brand, category);
Вот что получилось:

В этом примере запрос предполагает, что между брендом и категорией существует иерархия: бренд > категория.
Обратите внимание, что если вы измените порядок бренда и категории, результат будет другим, как показано в следующем запросе:
SELECT
category,
brand,
SUM(sales) sales
FROM
sales.sales_summary
GROUP BY
ROLLUP(category, brand);
В этом примере иерархия выглядит следующим образом: бренд > сегмент:

В следующем операторе показано, как выполнить частичное свертывание:
SELECT
brand,
category,
SUM(sales) sales
FROM
sales.sales_summary
GROUP BY
brand,
ROLLUP(category);
Выход:

В этом руководстве вы узнали, как использовать SQL Server ROLLUP для создания нескольких группировочных наборов с предположением об иерархии входных столбцов.




