SQL Server Rollup

在本教程中,将学习如何使用SQL Server ROLLUP生成多个分组集。

SQL Server ROLLUP简介

SQL Server ROLLUPGROUP BY子句的子句,它提供了定义多个分组集的简写。 与CUBE子句不同,ROLLUP不会根据维度列创建所有可能的分组集; CUBE是其中的一部分。

生成分组集时,ROLLUP假定维度列之间存在层次结构,并且仅基于此层次结构生成分组集。

ROLLUP通常用于生成小计和总计来生成报告目的。
考虑一个例子。 以下CUBE(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);

在此语法中,d1d2d3是维列。 该语句将根据层次结构d1> d2> d3计算列c4中的值的聚合。
还可以执行部分汇总以减少使用以下语法生成的小计:

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

SQL Server ROLLUP示例

在这个示例中将重用在GROUPING SETS教程中创建的sales.sales_summary表进行演示。 如果尚未创建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数据分组 下一篇: SQL Server子查询语句