В этом руководстве вы узнаете, как использовать SQL Server CUBE для создания нескольких группировочных наборов.
Введение в SQL Server CUBE
Группировочные наборы определяют группировки данных в одном запросе. Например, следующий запрос определяет один группировочный набор, представленный как(бренд):
SELECT
brand,
SUM(sales)
FROM
sales.sales_summary
GROUP BY
brand;
Если вы не следовали руководству 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;
Несмотря на то, что следующий запрос не использует предложение GROUP BY, он генерирует пустой набор группировки, который обозначается как().
SELECT
SUM(sales)
FROM
sales.sales_summary;
CUBE — это подпункт предложения GROUP BY, который позволяет вам генерировать несколько группирующих наборов. Ниже показан общий синтаксис CUBE:
SELECT
d1,
d2,
d3,
aggregate_function(c4)
FROM
table_name
GROUP BY
CUBE(d1, d2, d3);
В этом синтаксисе CUBE генерирует все возможные наборы группировки на основе столбцов измерений d1, d2 и d3, которые вы указываете в предложении CUBE.
Приведенный выше запрос возвращает тот же набор результатов, что и следующий запрос, который использует GROUPING SETS :
SELECT
d1,
d2,
d3,
aggregate_function(c4)
FROM
table_name
GROUP BY
GROUPING SETS(
(d1,d2,d3),
(d1,d2),
(d1,d3),
(d2,d3),
(d1),
(d2),
(d3),
()
);
Если в CUBE указано N столбцов измерений, то будет 2N наборов группировки.
Количество группировочных наборов можно сократить, частично используя CUBE, как показано в следующем запросе:
SELECT
d1,
d2,
d3,
aggregate_function(c4)
FROM
table_name
GROUP BY
d1,
CUBE(d2, d3);
В этом случае запрос генерирует четыре группировочных набора, поскольку в CUBE указано только два столбца измерений.
Примеры SQL Server CUBE
Следующий оператор использует CUBE для генерации четырех группирующих наборов:
- (бренд, категория)
- (бренд)
- (категория)
- ()
SELECT
brand,
category,
SUM(sales) sales
FROM
sales.sales_summary
GROUP BY
CUBE(brand, category);
Вот что получилось:

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

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




