SQL Server 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
GROUP BY 
    brand;

CUBEGROUP BY子句的子句,用于生成多个分组集。 以下是CUBE的一般语法:

SELECT
    d1,
    d2,
    d3,
    aggregate_function (c4)
FROM
    table_name
GROUP BY
    CUBE (d1, d2, d3);

在此语法中,CUBE根据在CUBE子句中指定的维度列:d1d2d3生成所有可能的分组集。

上面的查询返回与以下查询相同的结果集,该查询使用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), 
        ()
     );

如果在多维数据集中指定了N维列,则将具有2N个分组集。

通过部分使用CUBE可以减少分组集的数量,如以下查询所示:

SELECT
    d1,
    d2,
    d3,
    aggregate_function (c4)
FROM
    table_name
GROUP BY
    d1,
    CUBE (d2, d3);

在这种情况下,查询生成四个分组集,因为在CUBE中只指定了两个维列。

SQL Server CUBE示例

以下语句使用CUBE生成四个分组集:

(brand, category)
(brand)
(category)
()

参考以下查询语句:

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数据分组 下一篇: SQL Server子查询语句