子育てエンジニアブログ

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

複数行を1行にまとめるSQL

複数行を1行にまとめるSQLについてです。
対象DBはOracleです。

複数行を1行にまとめるにはLISTAGG関数というものを使用します。

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

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'
) ;

データは次のようになります。
f:id:STSA:20180513085553p:plain

では、id毎にkeydataを,区切りで1つの行にまとめる(複数行を1行にまとめる)SQLは以下のようになります。

SELECT id,
       LISTAGG(KEYDATA, ',') WITHIN GROUP (order by id) "1行にまとめる"
FROM testd
GROUP BY id

実行結果は次のようになります。
f:id:STSA:20180513090148p:plain