ProductID OrderMonth SubTotal 1 5 100.00 1 6 100.00 2 5 200.00 2 6 200.00 2 7 300.00 3 5 400.00 3 5 400.00
執行下面的語句: SELECT ProductID, [5] AS 五月, [6] AS 六月, [7] AS 七月 FROM Sales.Orders PIVOT ( SUM (Orders.SubTotal) FOR Orders.OrderMonth IN ( [5], [6], [7] ) ) AS pvt ORDER BY ProductID; 在上面的語句中,Sales.Orders是輸入表,Orders.OrderMonth是透視列(pivot_column),Orders.SubTotal是值列(value_column)。上面的語句將按下面的步驟獲得輸出結果集: a.PIVOT首先按值列之外的列(ProductID和OrderMonth)對輸入表Sales.Orders進行分組匯總,類似執行下面的語句: SELECT ProductID, OrderMonth, SUM (Orders.SubTotal) AS SumSubTotal FROM Sales.Orders GROUP BY ProductID,OrderMonth; 這時候將得到一個如表5-3所示的中間結果集。其中只有ProductID為3的產品由於在5月有2筆銷售記錄,被累加到了一起(值為800)。 表5-3 Sales.Orders表經分組匯總後的結果ProductID OrderMonth SumSubTotal 1 5 100.00 1 6 100.00 2 5 200.00 2 6 200.00 2 7 300.00 3 5 800.00
b.PIVOT根據FOR Orders.OrderMonth IN指定的值5、6、7,首先在結果集中建立名為5、6、7的列,然後從圖5-3所示的中間結果中取出OrderMonth列中取出相符合的值,分別放置到5、6、7的列中。此時得到的結果集的別名為pvt(見語句中AS pvt的指定)。結果集的內容如表5-4所示。 表5-4 使用FOR Orders.OrderMonth IN( [5], [6], [7] )後得到的結果集ProductID 5 6 7 1 100.00 100.00 NULL 2 200.00 200.00 200.00 3 800.00 NULL NULL
c.最後根據SELECT ProductID, [5] AS 五月, [6] AS 六月, [7] AS 七月FROM的指定,從別名pvt結果集中檢索數據,並分別將名為5、6、7的列在最終結果集中重新命名為五月、六月、七月。這裡需要注意的是FROM的含義,其表示從經PIVOT關系運算符得到的pvt結果集中檢索數據,而不是從Sales.Orders中檢索數據。最終得到的結果集如表5-5所示。 表5-5 由表5-2所示的Sales.Orders表將行轉換為列得到的最終結果集ProductID 五月 六月 七月 1 100.00 100.00 NULL 2 200.00 200.00 200.00 3 800.00 NULL NULL
UNPIVOT與PIVOT執行幾乎完全相反的操作,將列轉換為行。但是,UNPIVOT並不完全是PIVOT的逆操作,由於在執行PIVOT過程中,數據已經被進行了分組匯總,所以使用UNPIVOT並不會重現原始表值表達式的結果。假設表5-5所示的結果集存儲在一個名為MyPvt的表中,現在需要將列標識符“五月”、“六月”和“七月”轉換到對應於相應產品ID的行值(即返回到表5-3所示的格式)。這意味著必須另外標識兩個列,一個用於存儲月份,一個用於存儲銷售額。為了便於理解,仍舊分別將這兩個列命名為OrderMonth和SumSubTotal。參考下面的語句: CREATE TABLE MyPvt (ProductID int, 五月int, 六月 int, 七月int); --建立MyPvt表 GO --將表5-5中所示的值插入到MyPvt表中 INSERT INTO MyPvt VALUES (1,100,100,0); INSERT INTO MyPvt VALUES (2,200,200,200); INSERT INTO MyPvt VALUES (3,800,0,0); --執行UNPIVOT SELECT ProductID, OrderMonth, SubTotal FROM MyPvt UNPIVOT (SubTotal FOR OrderMonth IN (五月, 六月, 七月) )AS unpvt; 上面的語句將按下面的步驟獲得輸出結果集: a.首先建立一個臨時結果集的結構,該結構中包含MyPvt表中除IN (五月, 六月, 七月)之外的列,以及SubTotal FOR OrderMonth中指定的值列(SubTotal)和透視列(OrderMonth)。 b.將在MyPvt中逐行檢索數據,將表的列名稱(在IN (五月, 六月, 七月)中指定)放入OrderMonth列中,將相應的值放入到SubTotal列中。最後得到的結果集如表5-6所示。 表5-6 使用UNPIVOT得到的結果集ProductID OrderMonth SubTotal 1 五月 100 1 六月 100 1 七月 0 2 五月 200 2 六月 200 2 七月 200 3 五月 800 3 六月 0 3 七月 0