同じキー項目毎の縦複数行データをカンマ区切りで1カラムに変換するSQL


元テーブル

ID NAME
1 名1
1 名2
2 名3
2 名4
2 名5
3

 

結果テーブル

ID NAME1
1 名1,名2
2 名3,名4,名5
3

 

/* Oralce11g 同じキー項目毎の縦複数行データをカンマ区切りで1カラムに変換するSQL
 *【制限】
 * 1.列数固定
 * 2.Oralce11g、Ppstgresにて動作確認済
 *   ※但し、Ppstgresの場合、dualテーブルが使用できないため、from dualを削除すること。
 */
select 
	 id
	,name1
		|| case when name2 is not null then ',' || name2 end
		|| case when name3 is not null then ',' || name3 end
		|| case when name4 is not null then ',' || name4 end
		|| case when name5 is not null then ',' || name5 end
from 
(
select
	 sub.id
	,max(case when sub.rownumber = 1 then sub.name end) name1
	,max(case when sub.rownumber = 2 then sub.name end) name2
	,max(case when sub.rownumber = 3 then sub.name end) name3
	,max(case when sub.rownumber = 4 then sub.name end) name4
	,max(case when sub.rownumber = 5 then sub.name end) name5
from
	(
	select
		 data.*								-- 全項目取得
		,row_number() over(partition by id order by name) as rownumber	-- 行
	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
		union
			select '3' as id ,'' as name from dual
		) data
	) sub
group by
	sub.id
) main

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です