PIVOT 行列相轉

先介紹一下英文釋義:
pivot
英 ['pɪvət]  美 ['pɪvət]
n. 樞軸;中心點;旋轉運動
vt. 以…爲中心旋轉;把…置於樞軸上
vi. 在樞軸上轉動;隨…轉移
adj. 樞軸的;關鍵的
從上面就不難看出這個函數是作什麼的,旋轉,轉換,用於列和行之間對數據進行旋轉或透視轉換,同時執行聚合預算。
假設如今想查proudct數據表中返回每一個員工每一年處理過的訂單的總價格。在輸出中,每一個員工佔一行,每一個訂單年份佔一列,每一個員工行和訂單年份列交叉位置上則是總價。如下咱們用PIVOT查詢能夠實現這一需求。
-----需求表以下--------
 
員工     年份    金額
-------------------------
白潔      2005   150
孫倩      2007    360
--------------------------
SQL語句:
SELECT  *
FROM    ( SELECT   NAME ,
                    YEAR(shijian) AS T ,
                    jiage
          FROM      product
        ) AS ov PIVOT ( SUM(jiage) FOR t IN ( [2005], [2006], [2007] ) ) AS p
----------結果以下----------
 
 
下面咱們在分析一下PIVOT操做涉及如下三個邏輯階段:
1.P1:分姐
2.P2:擴展
3:聚合
  第一個階段(p1)有點意思,從查詢語句中能夠看到,PIVOT運算符引用了ov中的三個列做爲輸入參數(shijian(T),jiage),第一階段會隱式對OV中的行進行分組,分組是根據那些未做爲PIVOT輸入的全部列,就像是一個GROUT BY子句。這裏只有name列沒有出如今PIVOT的輸入參數中,全部每一個員工都一個組。
*PIVOT的隱式分組階段不會影響查詢中其餘行何的顯式的GROUP BY 子名,由於它最終會生成一個虛擬表,做爲下一個邏輯階段(也多是另外一個表運算,也許是WHERE階段)的輸入。
第二個階段(P2)將把(spreading_col)列表中的值擴展到它們相應的目標列上,下面用代碼解釋一下,更加直觀:
case when shijian=2005 then jiage end,
case when shijian=2006 then jiage end,
case when shijian=2007 then jiange end
*不帶ELSE的子句的CASE表達式相錄於包含一個隱式的ELSE NULL
每三階段(3)第三個階段對每一個CASE表達式應用指定的聚合函數,生成結果列,來段代碼,更加直觀:
sum(case when shijian=2006 then jiage end)as 2005,
sum(case when shijian=2006 then jiage end)as 2006,
sum(case when shijian=2007 then jiage end)as 2007
總之PIVOT查詢在邏輯上至關於下面的語句:
 
SELECT  name ,
        SUM(CASE WHEN t = 2006 THEN jiage
            END) AS [2005] ,
        SUM(CASE WHEN t = 2006 THEN jiage
            END) AS [2006] ,
        SUM(CASE WHEN t = 2007 THEN jiage
            END) AS [2007]
FROM    ( SELECT    name ,
                    YEAR(shijian) AS t ,
                    jiage
          FROM      product
        ) AS ov
GROUP BY name
     
------結果以下----------------
 
 
----2017-08-03 1:13 深圳福田梅林三村----
相關文章
相關標籤/搜索