1. 程式人生 > >pivot 與 unpivot 函數是SQL05新提供的2個函數

pivot 與 unpivot 函數是SQL05新提供的2個函數

src 理解 現在 var unp sina 效果 需要 art

pivot 與 unpivot 函數是SQL05新提供的2個函數

------------------------------------------------------------------------------

pivot函數:

create table test(id int,name varchar(20),quarter int,profile int)
insert into test values(1,‘a‘,1,1000)
insert into test values(1,‘a‘,2,2000)
insert into test values(1,‘a‘,3,4000)
insert into test values(1,‘a‘,4,5000)
insert into test values(2,‘b‘,1,3000)
insert into test values(2,‘b‘,2,3500)
insert into test values(2,‘b‘,3,4200)
insert into test values(2,‘b‘,4,5500)

select * from test --創建表test

技術分享

現在需要把quarter 從1列數據變成4列數據 效果如:

技術分享

把一列拆成幾列這時候就能使用pivot函數很簡單的實現

select * from test
pivot
(
sum([profile]) for [quarter]
in
([1],[2],[3],[4])
)
as
s

註:使用pivot把一列拆成幾列時 需要後面as取個別名 這是固定的格式 同時如 for前是必須使用聚合函數的

當然不使用pivot函數也可以得到相同效果 只是代碼長切效率低 但容易理解

select id,[name],
‘1‘=(select sum([profile]) from test where id=a.id and quarter=1),
‘2‘=(select sum([profile]) from test where id=a.id and quarter=2),
‘3‘=(select sum([profile]) from test where id=a.id and quarter=3),
‘4‘=(select sum([profile]) from test where id=a.id and quarter=4)
from test as a
group by id,name

-----------------------------------------------------------------------------------------

unpivot函數 顧名思義 他就是把幾列合並到1列中去

create table test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)

insert into test1 values(1,‘a‘,1000,2000,4000,5000)
insert into test1 values(2,‘b‘,3000,3500,4200,5500)

select * from test1 --創建test1表

技術分享

我們要把Q1 Q2 Q3 Q4合到1列 季度列中去 如效果:

技術分享

使用unpivot可以很簡單的實現

select id ,[name],[jidu],[xiaoshou] from test1
unpivot
(
xiaoshou for jidu in
([q1],[q2],[q3],[q4])
)
as f

註:同樣需要使用as取別名同樣是固定的格式 unpivot函數中沒有聚合函數 xiaoshou和jidu列都是原來沒有的 jidu表由原來的Q1 Q2 Q3 Q4組成

同樣的不使用unpivot也可以實現以上的功能

select id,[name],
jidu=‘Q1‘,
xiaoshou=(select Q1 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu=‘Q2‘,
xiaoshou=(select Q2 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu=‘Q3‘,
xiaoshou=(select Q3 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu=‘Q4‘,
xiaoshou=(select Q4 from test1 where id=a.id)
from test1 as a

pivot 與 unpivot 函數是SQL05新提供的2個函數