В этом руководстве вы узнаете, как использовать 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 для создания нескольких наборов группировки.