[SQL]將表格橫向呈現

1

文章分類: SQL語法, 資料庫 / Database




這是最近遇到的問題,想要將原本一直直往下列的縱向表格以橫向的方式顯示出來,在網路上查了一寫方法,現在寫下來做個筆記,順便把完成的方式做個分解步驟,因為直接看SQL可能會比較難明白,首先這是原始的表格

學號(id_num) 科目(subject) 成績(score)
101001 國文 85
101001 數學 70
101001 英文 80
101002 國文 73
101002 英文 89
101002 數學 68
101003 國文 70
101003 英文 68
101003 數學 88

希望能夠轉換成這樣的方式呈現

學號(id) 國文成績 英文成績 數學成績
101001 85 80 70
101002 73 89 68
101003 70 68 88

接下來就是拆解動作啦

步驟1: 用CASE WHEN … THEN … END語法將列出科目成績的欄位

SELECT id_num,
CASE WHEN subject='國文' THEN score END AS score_chinese,
CASE WHEN subject='英文' THEN score END AS score_english,
CASE WHEN subject='數學' THEN scree END AS score_math
FROM score_table

解說:使用CASE WHEN…的語法產生三個成績欄位,如果科目(subject)是國文的時候,將國文成績(score_chinese)的欄位帶入成績(score)資料,所以如果科目不是國文時,就會顯示成NULL,其他兩個欄位比照處理,此語法產生的表格如下

學號(id) 國文成績 英文成績 數學成績
101001 85 NULL NULL
101001 NULL 80 NULL
101001 NULL NULL 70
101002 73 89 68
101002 NULL 89 NULL
101002 NULL NULL 68
101003 70 68 88
101003 NULL 68 NULL
101003 NULL NULL 88

可以看到離目標只差一點點了,接下來進入步驟2

步驟2: 使用GROUP BY把學號群組起來,接著用MAX()語法把成績抓出來,完整的語法如下

SELECT id_num, MAX(score_chinese) AS '國文成績', MAX(score_english) AS '英文成績', MAX(score_math) AS '數學成績' 
FROM(
SELECT id_num,
CASE WHEN subject='國文' THEN score END AS score_chinese,
CASE WHEN subject='英文' THEN score END AS score_english,
CASE WHEN subject='數學' THEN scree END AS score_math
FROM score_table
) AS score_table_tmp
GROUP BY id_num

如此就可以將學號一列一列的顯示,成績則抓裡面的最大值,就可以產生這樣的結果啦

學號(id) 國文成績 英文成績 數學成績
101001 85 80 70
101002 73 89 68
101003 70 68 88

Comments (1)

感謝提供

發表回應

Bad Behavior has blocked 36 access attempts in the last 7 days.