web-dev-qa-db-ja.com

Oracleで複数の行を連結およびグループ化する

可能性のある複製:
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が利用できない場合のための、より一般的なソリューションにまだ興味があります。

29
user1693347

11gを使用している場合は [〜#〜] listagg [〜#〜] 関数を使用することを検討してください。

select grp, listagg(name,',') within group( order by name ) 
  from name_table group by grp

sqlFiddle

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

sqlFiddle

64
be here now