45 Stimmen

Verkettung und Gruppierung mehrerer Zeilen in Oracle

Mögliches Duplikat:
wie man in Oracle zwei Spalten im Format A,B abruft

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 dieses:

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 wie folgt verketten, aber mit der Gruppierung im Kontext habe ich wirklich nicht viel Ahnung.

Verkettung einer einspaltigen Tabelle:

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 

Aktualisiert:

Ich habe jetzt eine Lösung gefunden, indem ich LISTAGG :

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

Ich bin immer noch an einer "allgemeinen" Lösung für Fälle interessiert, in denen LISTAGG ist nicht verfügbar.

88voto

Kirill Leontev Punkte 10311

Erwägen Sie die Verwendung von LISTAGG Funktion, falls Sie mit 11g arbeiten:

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

sqlFiddle

aktualisieren: Falls Sie das nicht tun, sollten Sie eine Analyse in Betracht ziehen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X