在本教程中,将学习如何使用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;
CUBE
是GROUP BY
子句的子句,用于生成多个分组集。 以下是CUBE
的一般语法:
SELECT
d1,
d2,
d3,
aggregate_function (c4)
FROM
table_name
GROUP BY
CUBE (d1, d2, d3);
在此语法中,CUBE
根据在CUBE
子句中指定的维度列:d1
,d2
和d3
生成所有可能的分组集。
上面的查询返回与以下查询相同的结果集,该查询使用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子查询语句