子育てエンジニアブログ

子育てに励むシステムエンジニア(SE)のブログ

SQLで縦横変換の例

今日はSQLで縦横変換についての内容です。
対象のDBはOracleです。

テーブルで列の値によって取得結果を新しい列として作り出したい時があります。
そういう時に使えるSQLの例になっています。

もともと縦に持っていたデータを横(新しい列)にするので縦横変換です。

参考までにテスト的なテーブルとデータ。

create table testd
(
  id char(3) ,
  keydata char(10),
  ddata char(10)
);
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
            '111', 'A','100'
) ;
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
        '111', 'B','99'
) ;
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
        '111', 'C','70'
) ;
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
        '222', 'A','80'
) ;
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
        '222', 'B','85'
) ;
INSERT INTO testd (
        id, keydata ,ddata
) VALUES (
        '222', 'C','99'
) ;
INSERT INTO testd (
         id, keydata ,ddata
) VALUES (
        '333', 'A','50'
) ;

縦横変換のSQL

SELECT id,
       max(CASE WHEN keydata= 'A' THEN ddata END) AS "国語",
       max(CASE WHEN keydata = 'B' THEN ddata END) AS "数学",
       max(CASE WHEN keydata = 'C' THEN ddata END) AS "英語"
FROM testd
GROUP BY id
;

実行結果。
f:id:STSA:20180512110814p:plain

keydataの値でCASE文を使うことで、値によって新しい列として出力します。
ポイントはmaxをとってGROUP BYするところです。
GROUP BYしなければ1つの行にまとめることができません。
また、GROUP BYするには集計関数を使わないといけません。
SQLの意図としては1つの行にまとめたいだけなので、maxをとって1つの値に絞り込むようにします。