PIVOT函數--行轉列

首先我們來看下PIVOT函數的英文翻譯:

pivot:v 在樞軸上旋轉(轉動)

首先聲明下PIVOT函數的語法格式爲:

SELECT [字段1,2,3…] FROM [表名]    -- 將從##TEST表中選出的一些字段作爲原表。
AS [原表別名]
PIVOT( [聚合函數] ( [原表字段1] ) FOR [原表字段2] IN ( [原表2值1],[原表字段2值2]… ) ) AS [新表別名]

 

下面以例子講解PIVOT函數:

1、首先建立一個全局臨時表

-- 建立一個全局臨時表。臨時表還是挺好用的哈,不用寫入數據庫中,可以用來學習且不用切換數據庫
CREATE TABLE ##TEST( 
	project VARCHAR(10), -- 課程 
	student VARCHAR(20), -- 學生
	score DECIMAL        -- 成績
)
INSERT INTO ##TEST VALUES('語文','小林',85)
INSERT INTO ##TEST VALUES('語文','小龍',89)
INSERT INTO ##TEST VALUES('語文','小龍',98)
INSERT INTO ##TEST VALUES('數學','小林',95)
INSERT INTO ##TEST VALUES('數學','小龍',90)
INSERT INTO ##TEST VALUES('英語','小明',99)
INSERT INTO ##TEST VALUES('英語','小林',97)
INSERT INTO ##TEST VALUES('英語','小龍',98)

SELECT * FROM ##TEST 

結果如下:

然後我們寫一個PIVOT用法,來看看它的效果:

SELECT * FROM ##TEST
AS p  -- 將選中的字段作爲原表,對應的t表就是新表。
PIVOT(SUM(score) FOR project IN([語文],[數學],[英語])) AS t

可能一下看不懂,在本文的開頭我們提到PIVOT的英文含義是在樞軸上旋轉,上述sql語句中,直譯過來就是原表p以project這個單元格作爲樞軸,將project這一列逆時針旋轉90度,並去重,原來project的行變成了新表t中的列。

這樣可能還不能得到我們想要的結果:

你可能會疑問?爲什麼會出現聚合函數,我們知道,聚合函數是和GROUP BY一起使用的。這是因爲除了PIVOT函數裏出現的score和project字段外,原表p中的其他字段都將被GROUP BY,作爲新表中的行,因爲如此,使得PIVOT結果出現多行。

 

補充一點:臨時表只能執行一次,會暫時存貯在內存中,要想刪除臨時表,執行DROP TABLE ##TEST,即可。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章