SQL SERVER 2005+ 行列互转函数 PIVOT和UNPIVOT

PIVOT用于将列值旋转为列名(即行转列),UNPIVOT 正好相反

MSDN:http://technet.microsoft.com/zh-cn/library/ms177410.aspx

此函数2005以上版本才有的。

  

PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

完整语法:

table_source

PIVOT(

聚合函数(value_column

FOR pivot_column (包含要成为列标题的值的列)

IN(<column_list>)

)

 

UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

完整语法:

table_source

UNPIVOT(

value_column

FOR pivot_column

IN(<column_list>)

)

 

create table #tb(姓名 varchar(10),课程 varchar(10),分数 int)

insert into #tb values('张三','语文',74)

insert into #tb values('张三','数学',83)

insert into #tb values('张三','物理',93)
 
insert into #tb values('李四','语文',74)

insert into #tb values('李四','数学',84)

insert into #tb values('李四','物理',94)

SELECT * FROM #tb

结果:
姓名         课程         分数
---------- ---------- -----------
张三         语文         74
张三         数学         83
张三         物理         93
李四         语文         74
李四         数学         84
李四         物理         94

(6 行受影响)

 

 

PIVOT 函数:

 

SELECT * FROM(SELECT * FROM #TB PIVOT(MAX(分数) FOR 课程 IN (语文,数学,物理)) a) B

结果:

姓名         语文          数学          物理
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93

(2 行受影响)

 

UNPIVOT 函数:

 

 

--以上面的结果为例子 进行列转行
SELECT * FROM(SELECT * FROM #TB PIVOT(MAX(分数) FOR 课程 IN (语文,数学,物理)) a) B UNPIVOT(分数 for 课程 in([语文],[数学],[物理])) c

结果:

姓名         分数          课程
---------- ----------- -------------------
李四         74          语文
李四         84          数学
李四         94          物理
张三         74          语文
张三         83          数学
张三         93          物理

(6 行受影响)

 

posted @ 2011-01-14 14:24  Jeeris  阅读(778)  评论(2编辑  收藏  举报