Duplicata possible:
comment récupérer les données de deux colonnes au 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 seule colonne dans le tableau, je pourrais concaténer les enregistrements en procédant comme suit, mais avec le regroupement dans le contexte, je n'ai vraiment pas beaucoup d'idée.
Concaténation d'une table à colonnes:
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
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
Toujours intéressé par une solution plus "générale" pour les cas où LISTAGG
n'est pas disponible.
Pensez à utiliser la fonction LISTAGG si vous êtes sur 11g:
select grp, listagg(name,',') within group( order by name )
from name_table group by grp
upd: Dans le cas contraire, envisagez d'utiliser l'analytique:
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