PIVOT的中文意思是“在枢轴上转动”,比如对于一个2维坐标,将横坐标变成纵坐标,将纵坐标变成横坐标。反映在一个Relational Table上的意思就是:变行为列,变列为行。
表一:

表二:

将表一转换成表二:
SELECT
*
FROM
StudentScore
PIVOT
(
SUM (Score) FOR Subject IN ( [ 语文 ] , [ 数学 ] , [ 化学 ] , [ 物理 ] )
)
AS
B
PIVOT
(
SUM (Score) FOR Subject IN ( [ 语文 ] , [ 数学 ] , [ 化学 ] , [ 物理 ] )
)
AS
B
SUM(Score) 是我们需要统计的数据,FOR Subject IN ([语文],[数学],[化学],[物理]是统计的范围)就成了我们最终输出的结构了。
以上部分转自:http://blog.vsharing.com/janezhangxy/A1273548.html
UNPIVOT
建立测试表,插入测试数据
create
table
test(id
int
,name
varchar
(
20
), Q1
int
, Q2
int
, Q3
int
, Q4
int
)
insert into test values ( 1 , ' a ' , 1000 , 2000 , 4000 , 5000 )
insert into test values ( 2 , ' b ' , 3000 , 3500 , 4200 , 5500 )
select * from test
id name Q1 Q2 Q3 Q4
-- --------- --------------------
1 a 1000 2000 4000 5000
2 b 3000 3500 4200 5500
( 2 row(s) affected)
insert into test values ( 1 , ' a ' , 1000 , 2000 , 4000 , 5000 )
insert into test values ( 2 , ' b ' , 3000 , 3500 , 4200 , 5500 )
select * from test
id name Q1 Q2 Q3 Q4
-- --------- --------------------
1 a 1000 2000 4000 5000
2 b 3000 3500 4200 5500
( 2 row(s) affected)
利用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:
select
id,name,quarter,profile
from
test
unpivot
(
profile
for quarter in ( [ Q1 ] , [ Q2 ] , [ Q3 ] , [ Q4 ] )
)
as unpvt
id name quarter profile
from
test
unpivot
(
profile
for quarter in ( [ Q1 ] , [ Q2 ] , [ Q3 ] , [ Q4 ] )
)
as unpvt
id name quarter profile
--
--------- --------------------
1 a Q1 1000
1 a Q2 2000
1 a Q3 4000
1 a Q4 5000
2 b Q1 3000
2 b Q2 3500
2 b Q3 4200
2 b Q4 5500
( 8 row(s) affected)
1 a Q1 1000
1 a Q2 2000
1 a Q3 4000
1 a Q4 5000
2 b Q1 3000
2 b Q2 3500
2 b Q3 4200
2 b Q4 5500
( 8 row(s) affected)