在本教學中,將學習如何使用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);
執行上面查詢語句,得到以下結果:
上一篇:
SQL Server數據分組
下一篇:
SQL Server子查詢語句