WEB开发网
开发学院数据库MSSQL Server SQL Server2005杂谈(5):将聚合记录集逆时针和顺... 阅读

SQL Server2005杂谈(5):将聚合记录集逆时针和顺时针旋转90度

 2009-02-21 10:22:24 来源:WEB开发网   
核心提示: 3.在最后要为pivot函数起一个别名,虽然当要聚合的值很多时(或不确定),SQL Server2005杂谈(5):将聚合记录集逆时针和顺时针旋转90度(3),也需要动态生成SQL语句,但使用pivot函数的SQL语句却短很多,[abc] ,[xxx],[ttt]分别是图3所示的记录集的字

3.在最后要为pivot函数起一个别名。

虽然当要聚合的值很多时(或不确定),也需要动态生成SQL语句,但使用pivot函数的SQL语句却短很多。

如果我们还有一个需求,要将图3的结果变成图2的结果,也就是顺时针旋转90度,仍然以c和name作为字段名。也许方法很多,但SQL Server2005提供了一个unpivot函数,该函数是pivot函数的逆过程。也就是将记录集顺时针旋转90度,先看下面的SQL语句:

declare@ttable(namevarchar(20))
insert@t
select'abc'unionall
select'xxx'unionall
select'xxx'unionall
select'ttt'
;
withttas(
select*from@tpivot(count(name)fornamein([abc],[ttt],[xxx]))p)
select*fromtt

上面的SQL语句将输出如图3所示的结果。如果将最后一条SQL语句(select * from tt)换成如下的SQL语句,将输出如图2所示的结果。

select*fromtt unpivot([c]fornamein([abc],[xxx],[ttt]))p

要注意的是,[c]中的c表示聚合结果列的字段名,name表示要聚合列的字段名,这两个值可以是任意满足字段名命名规则的字符串,[abc] ,[xxx],[ttt]分别是图3所示的记录集的字段名,这些值必须一致。执行下面的SQL语句将获得图4的输出结果。

select*fromtt unpivot([统计值]for统计名in([abc],[xxx],[ttt]))p

图4

系列文章:

SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL

SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用

SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较

SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法

上一页  1 2 3 

Tags:SQL Server 杂谈

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接