65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (22投票s)

2008年9月14日

CPOL

2分钟阅读

viewsIcon

100182

分组集,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) , 
            ()          
      )

此语句的结果如下

Result.jpg

您可以看到结果集包含按指定分组集中每个集合分组的行。 您可以看到每个区域和部门的员工平均工资。 您还可以欣赏组织(对于区域和部门均为 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), 
            () 
      )
© . All rights reserved.