同じキー項目毎の縦複数行データを横複数列データに変換するSQL

Pocket

元テーブル

IDNAME
1名1
1名2
2名3
2名4
2名5

 

結果テーブル

IDNAME1NAME2NAME3NAME4NAME5
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;
タイトルとURLをコピーしました