T-Sql中的pivot和unpivot

  pivot運算符實現透視轉換

   透視轉換是指:將一種數據從行轉爲列的狀態的處理手段。主要經歷三個邏輯處理階段(分組,擴展,聚合)。

   sql2005引入的表的運算符-Pivot,跟其他表運算符(如join)類似,它也是在查詢的from子句上下文中執行操作,主要對某原表過表表達式進行操作,返回一個結果表。

   pivot運算符有重要地方需要注意:不必爲他顯示指定分組元素,或goup by子句,因爲它會隱式將那些沒有指定爲擴展元素,也沒有指定爲聚合元素的那些元素作爲分組元素。

    創建student表如下:

  

    用pivot行轉列語句如下:

select StuName,isnull(語文,0) as 語文 ,isnull(數學,0)as 數學 ,isnull(英語,0) as 英語 from student 

 pivot(min(StuGrade) for StuSubject in(語文,數學,英語))p

    這裏StuGrade作爲聚合元素,StuSubject作爲擴展元素,所以剩下的StuName就自動成了分組元素

結果如下:

 unpivot運算符實現逆透視轉換

    逆透視是指:一種將數據從列轉換成行狀態的處理手段。主要經過三個邏輯處理階段(生成副本,提取元素,刪除不相關的交叉)

    注意的是:經過透視轉換得到的表再進行逆透視轉換,並不會得到原來的表,因爲逆透視只是把透視轉換的表再轉換一個格式而已,但是經過透視轉換後再經過逆透視則能還原表的信息,即透視轉換中聚合操作會丟失原表的詳細信息,而逆透視則不會丟失任何信息。(因爲沒有經過聚合操作)

    這裏需要借用經過透視轉換的結果集。代碼如下:

with cc as
(
select stuName,isnull(數學,0) as 數學,isnull(語文,0)as 語文,isnull(英語,0)as 英語 from
(
select StuName,isnull(語文,0) as 語文 ,isnull(數學,0)as 數學 ,isnull(英語,0) as 英語 from student 

 pivot(min(StuGrade) for StuSubject in(語文,數學,英語))p
)
select stuName,StuSubject,StuGrade
from cc 
unpivot(StuGrade for StuSubject in(語文,數學,英語))as s

      這裏通過cte創建臨時結果集,注意upivot跟pivot的寫法區別就是:無須經過聚合操作,所以很好記。

發佈了1 篇原創文章 · 獲贊 86 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章