閱讀目錄
一:前言
二:第一次思考
三:第二次思考
四:第三次思考
一:前言
在我們做的一些項目中經常會碰到把行轉化為列的問題,那麼我們今天就來探討一下,我們怎麼樣把表1轉化為表2的格式
圖一
圖二
二:第一次思考
可以看得出來,表2列是由表1的資料行轉化而來的,只有Name列是表1中的列,一步一步的來,其他的列難搞,如果表2隻有1列Name的話,那麼簡單了,不就是一個簡單的分組
SELECT [Name] FROM NameAndSubjectAndGrade GROUP BY [Name]
現在SQL語句的架子搭起來了,無論以後如何變化,分組是少不了的
二:第二次思考
現在我們想在這個結果集中再添加1列,多了我們不加,因為你不論是能處理語文,還是數學,還是英語列,那麼其他的列只要原樣照抄就可以了,我們就只在現在的基礎上添加一個語文列吧
SELECT [Name], CASE WHEN Subject = '語文' THEN Grade END FROM NameAndSubjectAndGrade GROUP BY [Name]
我們看錯誤提示,Subject和Grade列要在彙總函式或者GROUP BY 子句中,那麼我們先把Subject和Grade列放在GROUP BY 子句中
SELECT [Name],CASE WHEN Subject = '語文' THEN Grade END FROM NameAndSubjectAndGrade GROUP BY [Name],Subject,Grade
資料倒是有了,可是行多了點,看來只能從彙總入手
三:第三次思考
我們從彙總函式入手
SELECT [Name],
SUM(CASE WHEN Subject = '語文' THEN Grade ELSE 0 END) AS YuWen
FROM NameAndSubjectAndGrade GROUP BY [Name]
那麼其他幾列也就好辦了,我們發揮我們的Ctr+C,Ctr+V
SELECT [Name],
SUM(CASE WHEN Subject = '語文' THEN Grade END) AS YuWen,
SUM(CASE WHEN Subject = '數學' THEN Grade END) AS ShuXue,
SUM(CASE WHEN Subject = '英語' THEN Grade END) AS YingYu
FROM NameAndSubjectAndGrade GROUP BY [Name]
四:第四次思考
馬六同學成天逃課,數學和英語就沒參加考試,那麼我們不應該顯示'NULL',應該顯示為'0',可是結果有NULL,那不太好,我們來把CASE WHEN THEN END寫完,在此之間加個ELSE 0
SELECT [Name],
SUM(CASE WHEN Subject = '語文' THEN Grade ELSE 0 END) AS YuWen,
SUM(CASE WHEN Subject = '數學' THEN Grade ELSE 0 END) AS ShuXue,
SUM(CASE WHEN Subject = '英語' THEN Grade ELSE 0 END) AS YingYu
FROM NameAndSubjectAndGrade GROUP BY [Name]
最後完成了