在本教程中,将学习如何使用SQL Server ROLLUP
生成多个分组集。
SQL Server ROLLUP简介
SQL Server ROLLUP
是GROUP 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);
在此语法中,d1
,d2
和d3
是维列。 该语句将根据层次结构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);
执行上面查询语句,得到以下结果: