【轉帖】PIVOT 用法淺嘗

原文地址http://hi.baidu.com/degilanvel/blog/item/07b4f245cab6ae46510ffe85.html

我覺得寫的不錯,分享下,呵呵

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

 

就個人感覺,PIVOT是用一個一維表數據建立一個二維表,一維表中包含X,Y座標及由這兩個座標值確定的一行中的需要顯示的數據;注意這個所用的一維表最好不可以包含多餘數據,否則會影響結果。

 

清單一:建立表,以使用最少的情況作例子

create table PivotTest (OrgID varchar(max),UserID varchar(max),JE money)

insert into PivotTest values('1001','A',200) 

insert into PivotTest values('1001','B',100) 

insert into PivotTest values('1002','A',300) 

insert into PivotTest values('1001','B',100)

insert into PivotTest values('1001','A',100)

insert into PivotTest values('1002','B',500)

insert into PivotTest values('1001','A',50)

insert into PivotTest values('1001','A',50)

insert into PivotTest values('1001','A',200)

insert into PivotTest values('1001','A',50)

insert into PivotTest values('1001','B',10)

select * from PivotTest

清單二:要求OrgID 爲X軸,UserID爲Y軸,統計每類情況的個數。

select OrgID,[A],[B]

from PivotTest a

Pivot (count(a.JE) FOR a.UserID in ([A],[B])) as PVT

輸出結果

/*

OrgID   A    B

1001     6     3
1002     1    1

*/

這裏使用的兩個座標外,用了另一個值來作統計;既然是統計數據,爲什麼不用X或Y座標的值呢?因爲多餘出來的非座標列將會影響輸出結果:舉例如下

select OrgID,[A],[B]

from PivotTest a

Pivot (count(a.UserID) FOR a.UserID in ([A],[B])) as PVT

輸出結果:

/*

OrgID   A      B

1001     0      1
1001     3      0
1001     1      2
1001     2      0
1002     1      0
1002     0      1

*/

可見,在這樣多處一列非座標列的情況下,JE數目不同,則也會被當作單獨的一個數值輸出而不會加和。

則可以有兩種方法,一種是使用非座標列,另一種是不使用座標列,後一種應這樣使用:

select OrgID,[A],[B]

from

(   select OrgID,UserID from PivotTest   ---在這裏剔除了JE列形成新表,剔除方法很實用

) a

Pivot (count(a.UserID) FOR a.UserID in ([A],[B])) as PVT

 

 

清單三:對要顯示的數值進行統計求和

select OrgID,[A] as '高級用戶',[B] as '普通用戶'

from PivotTest a

Pivot (sum(a.JE) FOR a.UserID in ([A],[B])) as PVT

輸出結果:

/*

OrgID  高級用戶    普通用戶

1001     650.00      210.00
1002     300.00      500.00

*/

問題:如果這裏被統計的數據外還有一列非軸數據,也會有影響麼。?

 

 

清單四:再添加一列測試數據

create table PivotTest1 (OrgID varchar(max),UserID varchar(max),JE1 money,JE2 money)

insert into PivotTest1 values('1001','A',200,1) 

insert into PivotTest1 values('1001','B',100,2) 

insert into PivotTest1 values('1002','A',300,1) 

insert into PivotTest1 values('1001','B',100,2)

insert into PivotTest1 values('1001','A',100,3)

insert into PivotTest1 values('1002','B',500,5)

insert into PivotTest1 values('1001','A',50,6)

insert into PivotTest1 values('1001','A',50,2)

insert into PivotTest1 values('1001','A',200,1)

insert into PivotTest1 values('1001','A',50,4)

insert into PivotTest1 values('1001','B',10,7)

 

select * from PivotTest1

 

 

清單五:同清單二做比較

select OrgID,[A],[B]

from PivotTest1 a

Pivot (count(a.JE1) FOR a.UserID in ([A],[B])) as PVT

輸出結果:

/*

OrgID    A    B

1001      2     0
1002      1     0
1001      1     2
1001      1     0
1001      1     0
1002      0     1
1001      1     0
1001      0     1

*/

可見,只要不是count()中的字段,就會自動作爲分類標準,這裏1001 1 2 指的就是數據

1001   B   100.00    2.00
1001   B    100.00   2.00
1001   A    50.00     2.00

三行的統計值,其中OrgID,JE2自動作爲縱向分類標準,UserID 作爲橫向分類標準。

驗證:

select OrgID,[A],[B]

from PivotTest1 a

Pivot (count(a.JE2) FOR a.UserID in ([A],[B])) as PVT

輸出結果:

/*

OrgID   A    B

1001     0    1
1001     3    0
1001     1    2   --爲 1001 B 100.00;1001 B 100.00;1001 A 100.00三行值的對應數據
1001     2     0
1002     1    0
1002     0    1

*/

select OrgID,[A],[B]

from PivotTest a

Pivot (count(a.UserID) FOR a.UserID in ([A],[B])) as PVT

情況相同,即以OrgID和JE共做縱向分類標準。

 

 

 

清單六:同清單三對比

select OrgID,[A] as '高級用戶',[B] as '普通用戶'

from PivotTest1 a

Pivot (sum(a.JE1) FOR a.UserID in ([A],[B])) as PVT

輸出結果

/*

OrgID  高級用戶    普通用戶

1001      400.00      NULL
1002      300.00      NULL
1001      50.00        200.00   --對應上面的說明
1001      100.00      NULL
1001      50.00        NULL
1002      NULL        500.00
1001      50.00       NULL
1001      NULL        10.00

*/

 

select OrgID,[A] as '高級用戶',[B] as '普通用戶'

from PivotTest1 a

Pivot (sum(a.JE2) FOR a.UserID in ([A],[B])) as PVT

輸出結果:

/*

OrgID  高級用戶    普通用戶

1001      NULL         7.00
1001      12.00        NULL
1001      3.00          4.00
1001      2.00          NULL
1002      1.00          NULL
1002      NULL         5.00

*/

梳理完畢。感冒難受死我了。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章