Concatena e raggruppa più righe in Oracle

Possibile duplicato:
come recuperare due colonne di dati in formato A, B in Oracle

Supponiamo che io abbia una tabella come questa:

NAME GROUP_NAME name1 groupA name2 groupB name5 groupC name4 groupA name3 groupC 

Mi piacerebbe avere un risultato come questo:

 GROUP_NAME NAMES groupA name1,name4 groupB name2 groupC name3,name5 

Se ci fosse solo una colonna nella tabella, potrei concatenare i record facendo quanto segue, ma con il raggruppamento nel contesto, non ho davvero molta idea.

Concatenamento di una tabella di colonne:

 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 

aggiornato:

Ora ho una soluzione usando LISTAGG :

 SELECT group_name, LISTAGG(name, ', ') WITHIN GROUP (ORDER BY GROUP) "names" FROM name_table GROUP BY group_name 

Ancora interessato a una soluzione più “generale” per i casi in cui LISTAGG non è disponibile.

Prendi in considerazione l’uso della funzione LISTAGG nel caso tu sia su 11g:

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

sqlFiddle

upd: nel caso in cui non lo sei, considera l’utilizzo di analytics:

 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