sql中PIVOT 用法詳解

PIVOT 和 UNPIVOT 關係運算符將表值表達式更改爲另一個表。

PIVOT 通過將表達式某一列中的唯一值轉換爲輸出中的多個列來旋轉表值表達式,並在必要時對最終輸出中所需的任何其餘列值執行聚合。 PIVOT 提供的語法比一系列複雜的 SELECT...CASE 語句中所指定的語法更簡單和更具可讀性。

在我們進行復雜的查詢統計的時候,特別是銷售統計、處理大量數據的時候,PIVOT的作用就顯得非常突出。

案例分析:在開發一個收集客戶資源的小型系統時,需要對客戶的資源進行查詢統計,本來想用原來的統計解決方案,但是哥們提出了使用Pivot函數,這個我還真沒用過,所以就針對這個函數進行了一些學習。

每一個客戶資源通過不同的渠道進來,需要公司成員對用戶的信息進行處理,回訪、郵件之類的,所以客戶信息的狀態需要修改,而且需要對每一種狀態的客戶信息進行統計。如果按照舊的邏輯,採用簡單的Count語句去查詢統計,SQL語句如下:

  1. select S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S
  2. group by S.F_status
複製代碼

你得到的結果類似於:

F_status F_Count
----------- -----------
NULL 4
1 1
4 2
5 1
6 5
7 1

如果是查詢整個數據表的統計信息,或許這樣做也不是很麻煩,只需要遍歷你得到的表,取出數據,然後匹配到某一狀態就可以。但是,如果根據客戶信息不同來源進行統計,顯然這樣做,侷限性很大,我們沒有辦法一次性得到各個來源的統計信息。而採用PIVOT,你會得到如下的結果:

F_Num F_Source F_Total F_Normal F_Crm F_Wait F_InEffect F_Effect
----------- ------- ----------- ----------- ----------- ----------- ----------- -----------
1 First 3 0 2 0 0 1
2 Second 3 0 0 1 0 2
3 Third 3 0 0 0 1 2
4 Forth 1 1 0 0 0 0
5 Other 0 0 0 0 0 0

它把原來一列的數據,變成了Table的一行數據,而我們要展示給用戶的也是這樣一張表,所以利用此函數可以節省大量的邏輯代碼。方便、快捷、高效。

具體的SQL語句如下:

  1. select * from
  2. (
  3. select S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S
  4. group by S.F_status
  5. )As T
  6.  
  7. PIVOT(sum(T.F_Count) for T.F_Status in([1],[4],[5],[6],[7])) as C
複製代碼

在這裏,我對其顯示進行一些加工和判定:

加工後的SQL語句

  1. select F_PsnID,isnull([1],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0) as 'F_Total',isnull([1],0) as 'F_Normal',
  2. isnull([4],0) as 'F_NormalCrm',isnull([5],0) as 'F_Wait',isnull([7],0) as 'F_InEffect',isnull([6],0) as 'F_Effect'
  3. from (
  4.  
  5. select S.F_PsnID,S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S
  6. where (1=1)
  7. group by S.F_PsnID,S.F_status
  8.  
  9. )As T
  10.  
  11. PIVOT(sum(T.F_Count) for T.F_Status in([1],[4],[5],[6],[7])) as C
  12. order by F_Total desc
複製代碼

當然這只是個簡單的小例子,你可以使用PIVOT,然後進行加工處理,它可以實現更爲強大的功能。我在應用的時候用到了加入了臨時表、分頁等功能。

UNPIVOT 與 PIVOT 執行相反的操作,將表值表達式的列轉換爲列值。但是在實際應用中,有些聚合之後的數據很難進行拆分。所以呢,UNPIVOT並非PIVOT的逆過程。

建議:如果你想了解的更加清楚,請參考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:對升級到 SQL Server 2005 或更高版本的數據庫使用 PIVOT 和 UNPIVOT 時,必須將數據庫的兼容級別設置爲 90 或更高。

有的SQL Server 2005初始安裝時,默認的兼容級別爲“80”,這時我們需要將兼容級別進行設置,不然,PIVOT不能正常的執行。我在使用PIVOT時就遇到這樣的問題。

具體的修改方案如下:

修改兼容級別步驟
1、連接到相應的 SQL Server 數據庫引擎實例之後,在對象資源管理器中,單擊服務器名稱以展開服務器樹。

2、展開“數據庫”,然後根據數據庫的不同,選擇用戶數據庫,或展開“系統數據庫”,再選擇系統數據庫。

3、右鍵單擊數據庫,再單擊“屬性”。

“數據庫屬性”對話框將打開。

4、在“選擇頁”窗格中,單擊“選項”。

當前兼容級別顯示在“兼容級別”列表框中。

5、若要更改兼容級別,請從列表中選擇其他選項。 可用選項包括 SQL Server 2000 (80)、SQL Server 2005 (90) 或 SQL Server 2008 (100)。
具體的兼容級別之間的差異請參考:http://technet.microsoft.com/zh-cn/library/bb510680.aspx

如有不妥之處,請留言批評指正。

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