PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。
UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值。
通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行
VALUES ( 2006, 'Q1', 20 )
VALUES ( 2006, 'Q2', 15 )
VALUES ( 2006, 'Q3', 12 )
VALUES ( 2006, 'Q4', 18 )
VALUES ( 2007, 'Q1', 10 )
VALUES ( 2007, 'Q2', 10 )
VALUES ( 2008, 'Q3', 10 )
FROM Sell PIVOT ( SUM(Quantity) FOR [Quarter] IN ( Q1, Q2, Q3, Q4 ) ) AS P
--如果子组为空,SQL Server生成空值。如果聚合函数是COUNT,且子组为空,则返回零。
其实PIVOT在sql2000中可以用SELECT...CASE语句来实现,下面是sql2000的代码:
SUM(CASE WHEN [Quarter] = 'Q1' THEN Quantity
SUM(CASE WHEN [Quarter] = 'Q2' THEN Quantity
SUM(CASE WHEN [Quarter] = 'Q3' THEN Quantity
SUM(CASE WHEN [Quarter] = 'Q4' THEN Quantity
DECLARE @sql NVARCHAR(2000)
SELECT @sql = 'select [year] '
SELECT @sql = @sql + ',sum(case when [Quarter] =''' + [Quarter]
+ ''' then Quantity end) as ' + [Quarter]
select @sql = @sql + ' from sell group by [year] '
UNPIVOT将与PIVOT执行几乎完全相反的操作,将列转换为行。
VALUES ( 1, 'q1', 'q2', 'q3' )
VALUES ( 2, 'q1', 'p1', 'm1' )
VALUES ( 3, 't1', 'p1', 'm1' )
) p UNPIVOT ( [Value] FOR A IN ( A1, A2, A3 ) )AS u
--UNPIVOT 的sql 2000 实现语句:
个人感觉PIVOT运算符相比SELECT...CASE语句就是代码精简了一些,似乎PIVOT可读性好像不太好!
至少我看起来PIVOT语法有点怪怪,也许是还习惯吧!我个人还是喜欢用SELECT...CASE语句.
希望微软能提供PIVOT运算符的动态版本,这样动态生成列时,不用那么费事的累加字符串
A.Sql Server2005 Transact-SQL 新兵器学习
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8>
Sql Server2005 Transact-SQL 新兵器学习总结之-总结
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结)
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现)
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现)
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)
Mcad学习笔记之序列化(2进制和Soap序列 化)
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨)
本文转自aierong博客园博客,原文链接http://www.cnblogs.com/aierong/archive/2008/09/01/1279463.html如需转载请自行联系原作者