天天看點

逆透視轉換

逆透視轉換(unpivoting)是一種把資料從列的狀态旋轉為行的狀态的技術。通常,它涉及查詢資料的透視狀态,将來自單個記錄中多個列的值擴充為單個列中具有相同值的多個記錄。換句話說,把透視表中的每個源行潛在地轉換成多個行,每行代表源透視表的一個指定的列值。

使用标準SQL 進行逆透視轉換

逆透視轉換的标準要SQL解決方案非常明确地要實作3個邏輯處理階段:生成副本、提取元素和删除不相關的交叉。

解決方案的第一步是根據來源表的每一行生成多個副本(為需要逆透視的每個列生成一個副本)。

SELECT *

FROM (SELECT empid,custid,

    CASE custid

      WHEN ‘A‘ THEN A

      WHEN ‘B‘ THEN B

    END AS qty

  FROM dbo.EmpCustOrders

    CROSS JOIN (VALUES(‘A‘),(‘B‘)) AS Custs(custid) AS D

WHERE qty IS NOT NULL ;

使用 T-SQL 的UNPIVOT 運算符進行逆透視轉換

對資料進行逆透視轉換時,會為源表中想要進行逆透視的任意列生成兩個結果列。

與PIVOT 運算符類似。UNPIVOT 也是作為表運算符,在FROM

子句的上下文中執行操作。它的操作對象是源表或表表達式。在UNPIVOT去處符的圓括号中需要指定的内容包括:用于儲存源表列值的目标列名,以及源表的列名清單。在UNPIVOT

運算符的圓括号的後面,可以為表運算符的結果表提供一個别名。\

select col1,col2,col3

from (

select ‘a‘ as col1,‘2‘ as b,‘3‘ as c ) as

t

unpivot (col3 for col2 in (b,c)) as unp

注意:UNPIVOT 運算符會執行與前面介紹的邏輯處理階段相同的幾個步驟:生成副本、提取元素和删除交叉位置上的NULL值。與基于标準SQL

的解決方案相比,UNPIVOT 的最後一個階段是不可選的。

還要注意,對經過透視轉換所得的表再進行逆透視轉換,并不能得到原來的表。因為逆透視轉換隻是把經過透視轉換後的值再旋轉到另一種新的格式。但是,經過逆透視轉換後的表可以再通過透視轉換回到原來的狀态。換句話說,透視轉換中的聚合操作會丢失掉源表中的詳細資訊。經過透視轉換後,儲存下來的隻是操作之間的所有聚合結果,而逆透視轉換則不會丢失任何資訊。