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 行受影响)
来源:https://www.cnblogs.com/jeerisguo/archive/2011/01/14/1935561.html