T-SQL 中的分组集 (SQL Server 2008)






4.88/5 (22投票s)
分组集,T-SQL 在 SQL Server 2008 中的一项新功能。
引言
本文讨论了 T-SQL 中的分组集。分组集是 SQL Server 2008 中 T-SQL 的一项新功能。
背景
每当需要从任何结果集中获取 DISTINCT
时,人们都忍不住赞赏 GROUP BY
子句。此外,每当需要任何聚合函数时,GROUP BY
子句是唯一的解决方案。一直都有一个需求,即基于同一结果集中的不同列集获取这些聚合函数。使用此功能也是安全的,因为它是一个 ISO 标准。
虽然之前可以实现相同的结果,但我们需要编写不同的查询,并使用 UNION
运算符将它们组合起来。 GROUPING SET
返回的结果集是基于分组集中每个集合中指定的列的聚合的并集。
示例
为了完全理解它,我们首先创建一个表 tbl_Employee。
CREATE TABLE tbl_Employee
(
Employee_Name varchar(25),
Region varchar(50),
Department varchar(40),
sal int
)
现在,我们用以下一些行填充表
INSERT into tbl_Employee(
Employee_Name,
Region,
Department,
sal
)
VALUES
('Shujaat', 'North America', 'Information Technology', 9999),
('Andrew', 'Asia Pacific', 'Information Technology', 5555),
('Maria', 'North America', 'Human Resources', 4444),
('Stephen', 'Middle East & Africa', 'Information Technology', 8888),
('Stephen', 'Middle East & Africa', 'Human Resources', 8888)
填充行后,我们使用分组集选择一些行。
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
GROUPING SETS
(
(Region, Department),
(Region),
(Department) ,
()
)
此语句的结果如下
您可以看到结果集包含按指定分组集中每个集合分组的行。 您可以看到每个区域和部门的员工平均工资。 您还可以欣赏组织(对于区域和部门均为 NULL
)的员工平均工资。 这是空分组集的结果,即 ()
。
在 2008 年之前,如果您需要获得相同的结果集,则必须编写以下查询
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
Region, Department
UNION
SELECT Region, NULL, avg(sal) Average_Salary
from tbl_Employee
Group BY
Region
UNION
SELECT NULL, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
Department
UNION
SELECT NULL, NULL, avg(sal) Average_Salary
from tbl_Employee
通过查看上面的查询,您可以欣赏分组集为开发人员提供的便利。
用于分组的 CUBE 子句
这用于为 n 个元素返回 n 的 2 次方。
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
CUBE (Region, Department)
上面的查询等效于以下查询
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
GROUPING SETS
(
(Region, Department),
(Region),
(Department) ,
()
)
用于分组的 ROLLUP 子句
这用于为层次结构场景中的 n 个元素返回 n+1 个分组集。
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
ROLLUP (Region, Department)
这等效于以下查询
SELECT Region, Department, avg(sal) Average_Salary
from tbl_Employee
Group BY
Grouping Sets
(
(Region, Department),
(Region),
()
)