上一篇說了一下查詢5步走~然後就幾天_(:з」∠)_ ~今天繼續說一下其中 表裡面操作符裡面的 Pivot ~ Pivot 在實現行轉列的時候灰常有用。通常一個例子 CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime
上一篇說了一下查詢5步走~然後就幾天_(:з」∠)_ ~今天繼續說一下其中 表裡面操作符裡面的 Pivot ~
Pivot 在實現行轉列的時候灰常有用。通常一個例子
CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime TIME) INSERT INTO #Tbl ( Emp, WeekDay, LoginTime ) VALUES ( 'Mart','Mon','09:00'),( 'Mart','TUE','08:55'),( 'Mart','Wed','09:02'),( 'Mart','Thu','08:50'), ( 'Ken','Mon','09:00'),( 'Ken','TUE','08:53'),( 'Ken','Wed','09:03'),( 'Ken','Thu','08:51'), ( 'Reach','Mon','09:00'),( 'Reach','TUE','08:51'),( 'Reach','Wed','09:04'),( 'Reach','Thu','08:57') SELECT * FROM #Tbl PIVOT(MIN(LoginTime) FOR [WeekDay] IN ([Mon],[Tue],[Wed],[Thu])) AS a Emp Mon Tue Wed Thu -------------------------------------------------- ---------------- ---------------- ---------------- ---------------- Ken 09:00:00.0000000 08:53:00.0000000 09:03:00.0000000 08:51:00.0000000 Mart 09:00:00.0000000 08:55:00.0000000 09:02:00.0000000 08:50:00.0000000 Reach 09:00:00.0000000 08:51:00.0000000 09:04:00.0000000 08:57:00.0000000
這樣簡單就搞掂了一個行轉列。
其實在這個步驟裡面,Pivot 運算符就幹了3件事~
1、分組:首先 Pivot 會將裡面沒有被提及的欄位,在我的這個例子裡面,就是將 Emp 加上 For 裡面提及的 WeekDay 來分組。當然,這一步是不會影響到外部的Group by 語句的, 因為Povit 僅僅相當於 from 裡面的一個運算,生成一個輸入表,提供給下一步操作使用而已
(想象狀態,這是經過步驟1 得出的虛擬表)
Emp WeekDay LoginTime -------------------------------------------------- -------------------------------------------------- ---------------- Ken Mon 09:00:00.0000000 Mart Mon 09:00:00.0000000 Reach Mon 09:00:00.0000000 Ken Thu 08:51:00.0000000 Mart Thu 08:50:00.0000000 Reach Thu 08:57:00.0000000 Ken TUE 08:53:00.0000000 Mart TUE 08:55:00.0000000 Reach TUE 08:51:00.0000000 Ken Wed 09:03:00.0000000 Mart Wed 09:02:00.0000000 Reach Wed 09:04:00.0000000
有沒有很熟悉,其實跟這句查詢語句得出的結果一樣
SELECT a.Emp,a.WeekDay,MIN(a.LoginTime) AS LoginTime FROM #Tbl a GROUP BY a.Emp,a.WeekDay
2、擴展:分組完成。之後,需要將 In () 包含的欄位擴展出來。在這個例子裡面就是要擴充到 'Mon','Tue','Wed','Thu' 這4個位置。要對於指定的列,才聚合數值,否則則為 Null.
MIN(CASE WHEN a.WeekDay = 'Mon' THEN a.LoginTime ELSE NULL END) AS [Mon], MIN(CASE WHEN a.WeekDay = 'Tue' THEN a.LoginTime ELSE NULL END) AS [Tue], MIN(CASE WHEN a.WeekDay = 'Wed' THEN a.LoginTime ELSE NULL END) AS [Wed], MIN(CASE WHEN a.WeekDay = 'Thu' THEN a.LoginTime ELSE NULL END) AS [Thu]
當然羅 Min 這個運算符,是跟Pivot 裡面輸入的操作符一致的~
3、 聚合。有了第二步,聚合個結果列就OK了。就得出我們上面的結果~
以上~
參考 :<Sql server 2008 技術內幕 查詢>