可能性のある複製:
OracleでA、B形式の2つの列データを取得する方法
次のようなテーブルがあるとします:
NAME GROUP_NAME
name1 groupA
name2 groupB
name5 groupC
name4 groupA
name3 groupC
私はこのような結果が欲しいです:
GROUP_NAME NAMES
groupA name1,name4
groupB name2
groupC name3,name5
テーブルに列が1つしかない場合、次の操作を行うことでレコードを連結できますが、コンテキストでグループ化すると、あまり考えがありません。
1つの列テーブルを連結する:
SELECT names
FROM (SELECT SYS_CONNECT_BY_PATH(names,' ') names, level
FROM name_table
START WITH names = (SELECT names FROM name_table WHERE rownum = 1)
CONNECT BY PRIOR names < names
ORDER BY level DESC)
WHERE rownum = 1
私は今LISTAGG
を使用して解決策を持っています:
SELECT
group_name,
LISTAGG(name, ', ')
WITHIN GROUP (ORDER BY GROUP) "names"
FROM name_table
GROUP BY group_name
LISTAGG
が利用できない場合のための、より一般的なソリューションにまだ興味があります。
11gを使用している場合は [〜#〜] listagg [〜#〜] 関数を使用することを検討してください。
select grp, listagg(name,',') within group( order by name )
from name_table group by grp
upd:そうでない場合は、分析の使用を検討してください:
select grp,
ltrim(max(sys_connect_by_path
(name, ',' )), ',')
scbp
from (select name, grp,
row_number() over
(partition by grp
order by name) rn
from tab
)
start with rn = 1
connect by prior rn = rn-1
and prior grp = grp
group by grp
order by grp