天天看點

SQL行轉列 列轉行實作

    前言

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

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

SQL行轉列 列轉行實作

    行轉列

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

    當然我們也可以用 CASE WHEN 得到同樣的結果,就是寫起來麻煩一點。使用 CASE WHEN 可以得到和 PIVOT 同樣的結果,沒有 PIVOT 簡單直覺。

-- 方法一
SELECT 
    *
FROM student
PIVOT (
    SUM(score) FOR subject IN (國文, 數學, 英語)
);

-- 方法二
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 student
GROUP BY name;
           

    列轉行

-- 方法一
SELECT 
    *
FROM student
UNPIVOT (
    score FOR subject IN ("國文","數學","英語")
);

-- 方法二
SELECT
    NAME,
    '國文' AS subject,
    MAX("國文") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
    NAME,
    '數學' AS subject,
    MAX("數學") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
    NAME,
    '英語' AS subject,
    MAX("英語") AS score
FROM student1 GROUP BY NAME;
           
下一篇: SQL行列轉換