元テーブル
ID | NAME |
1 | 名1 |
1 | 名2 |
2 | 名3 |
2 | 名4 |
2 | 名5 |
結果テーブル
ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME5 |
1 | 名1 | 名2 | |||
2 | 名3 | 名4 | 名5 |
/* Oralce11g 同じキー項目毎の縦複数行データを横複数列データに変換するSQL *【制限】 * 1.列数固定 * 2.Oralce11g、Ppstgresにて動作確認済 * ※但し、Ppstgresの場合、dualテーブルが使用できないため、from dualを削除すること。 */ select maintbl.id ,max(case when maintbl.rowtbl = 1 then maintbl.name end) name1 ,max(case when maintbl.rowtbl = 2 then maintbl.name end) name2 ,max(case when maintbl.rowtbl = 3 then maintbl.name end) name3 ,max(case when maintbl.rowtbl = 4 then maintbl.name end) name4 ,max(case when maintbl.rowtbl = 5 then maintbl.name end) name5 from ( select tbl.* -- 全項目取得 ,row_number() over(partition by id order by name) as rowtbl -- 行 from -- ワークテーブル ( select '1' as id ,'名1' as name from dual union select '1' as id ,'名2' as name from dual union select '2' as id ,'名3' as name from dual union select '2' as id ,'名4' as name from dual union select '2' as id ,'名5' as name from dual ) tbl ) maintbl group by maintbl.id;