Concaténer et grouper plusieurs lignes dans Oracle [dupliquer]

possibilité de duplication:

comment récupérer deux colonnes de données dans le format A, B dans Oracle

supposons que j'ai une table comme celle-ci:

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

j'aimerais avoir un résultat comme celui-ci:

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

S'il n'y avait qu'une colonne dans le tableau, je pourrais concaténer les enregistrements en faisant ce qui suit, mais avec le regroupement dans le contexte, je n'ai pas vraiment d'idée.

comportant une 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 

mise à jour:

j'ai maintenant une solution en utilisant LISTAGG :

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

est toujours intéressé par une solution plus" générale "pour les cas où LISTAGG n'est pas disponible.

23
demandé sur Community 2012-09-24 07:32:47

1 réponses

envisager d'utiliser LISTAGG fonction au cas où vous êtes sur 11g:

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

sqlFiddle

upd: dans le cas où vous ne l'êtes pas, envisagez d'utiliser des statistiques:

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

53
répondu be here now 2015-10-26 10:04:01