SQL-сервер CUBE

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

  1. (бренд, категория)
  2. (бренд)
  3. (категория)
  4. ()
SELECT
    brand,
    category,
    SUM(sales) sales
FROM
    sales.sales_summary
GROUP BY
    CUBE(brand, category);

Вот что получилось:

Пример SQL Server CUBE

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

Следующий пример иллюстрирует, как выполнить частичный CUBE для уменьшения количества группировочных наборов, генерируемых запросом:

SELECT
    brand,
    category,
    SUM(sales) sales
FROM
    sales.sales_summary
GROUP BY
    brand,
    CUBE(category);

На следующем рисунке показан результат:

Частичный пример SQL Server CUBE

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

Мирослав С.

Автор статей, ИБ-специалист