先介紹一下英文釋義: pivot 英 ['pɪvət] 美 ['pɪvət] n. 樞軸;中心點;旋轉運動 vt. 以…為中心旋轉;把…置於樞軸上 vi. 在樞軸上轉動;隨…轉移 adj. 樞軸的;關鍵的 從上面就不難看出這個函數是做什麼的,旋轉,轉換,用於列和行之間對數據進行旋轉或透視轉換,同時執 ...
先介紹一下英文釋義: 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 深圳福田梅林三村----