這是最近遇到的問題,想要將原本一直直往下列的縱向表格以橫向的方式顯示出來,在網路上查了一寫方法,現在寫下來做個筆記,順便把完成的方式做個分解步驟,因為直接看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 |

感謝提供