天天看點

sql 列轉行_SQL 行轉列,列轉行

sql 列轉行_SQL 行轉列,列轉行

  行列轉換在做報表分析時還是經常會遇到的,今天就說一下如何實作行列轉換吧。

  行列轉換就是如下圖所示兩種展示形式的互相轉換

sql 列轉行_SQL 行轉列,列轉行

 行轉列

  假如我們有下表:

sql 列轉行_SQL 行轉列,列轉行
SELECT *FROM studentPIVOT (    SUM(score) FOR subject IN (國文, 數學, 英語))
           

  通過上面 SQL 語句即可得到下面的結果

sql 列轉行_SQL 行轉列,列轉行

  PIVOT 後跟一個聚合函數來拿到結果,FOR 後面跟的科目是我們要轉換的列,這樣的話科目中的國文、數學、英語就就被轉換為列。IN 後面跟的就是具體的科目值。

  當然我們也可以用 CASE WHEN 得到同樣的結果,就是寫起來麻煩一點。

SELECT name,  MAX(  CASE    WHEN subject='國文'    THEN score    ELSE 0  END) AS "國文",  MAX(  CASE    WHEN subject='數學'    THEN score    ELSE 0  END) AS "數學",  MAX(  CASE    WHEN subject='英語'    THEN score    ELSE 0  END) AS "英語"FROM studentGROUP BY name
           

  使用 CASE WHEN 可以得到和 PIVOT 同樣的結果,沒有 PIVOT 簡單直覺。

 列轉行

  假設我們有下表 student1

sql 列轉行_SQL 行轉列,列轉行
SELECT *FROM student1UNPIVOT (    score FOR subject IN ("國文","數學","英語"))
           

  通過 UNPIVOT 即可得到如下結果:

sql 列轉行_SQL 行轉列,列轉行

  我們也可以使用下面方法得到同樣結果

SELECT    NAME,    '國文' AS subject ,    MAX("國文") AS scoreFROM student1 GROUP BY NAMEUNIONSELECT    NAME,    '數學' AS subject ,    MAX("數學") AS scoreFROM student1 GROUP BY NAMEUNIONSELECT    NAME,    '英語' AS subject ,    MAX("英語") AS scoreFROM student1 GROUP BY NAME
           
sql 列轉行_SQL 行轉列,列轉行

繼續閱讀