Mögliches Duplikat:
Abrufen von zwei Spaltendaten im A- und B-Format in Oracle
Angenommen, ich habe eine Tabelle wie diese:
NAME GROUP_NAME
name1 groupA
name2 groupB
name5 groupC
name4 groupA
name3 groupC
Ich hätte gerne ein Ergebnis wie das folgende:
GROUP_NAME NAMES
groupA name1,name4
groupB name2
groupC name3,name5
Wenn es nur eine Spalte in der Tabelle gäbe, könnte ich die Datensätze folgendermaßen verketten, aber mit der Gruppierung im Kontext habe ich wirklich keine Ahnung.
Verketten einer Spaltentabelle:
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
Ich habe jetzt eine Lösung mit LISTAGG
:
SELECT
group_name,
LISTAGG(name, ', ')
WITHIN GROUP (ORDER BY GROUP) "names"
FROM name_table
GROUP BY group_name
Immer noch interessiert an einer "allgemeineren" Lösung für Fälle, in denen LISTAGG
nicht verfügbar ist.
Erwägen Sie die Verwendung der Funktion LISTAGG , falls Sie mit 11g arbeiten:
select grp, listagg(name,',') within group( order by name )
from name_table group by grp
upd: Falls dies nicht der Fall ist, ziehen Sie die Verwendung von Analytics in Betracht:
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