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 行受影响)