A partir de Oracle 11g Release 2 une nouvelle fonction analytique LISTAGG est disponible pour concaténer les données réparties sur plusieurs lignes.
Auparavant il fallait créer une fonction. Certes ce n’était pas très difficile à faire mais maintenant c’est intégré dans la base !
Exemple :
With emp as (
select 20 deptno, 'SMITH' ename from dual UNION ALL
select 30 deptno, 'ALLEN' ename from dual UNION ALL
select 30 deptno, 'WARD' ename from dual UNION ALL
select 20 deptno, 'JONES' ename from dual UNION ALL
select 30 deptno, 'MARTIN' ename from dual UNION ALL
select 30 deptno, 'BLAKE' ename from dual UNION ALL
select 10 deptno, 'CLARK' ename from dual UNION ALL
select 20 deptno, 'SCOTT' ename from dual UNION ALL
select 10 deptno, 'KING' ename from dual UNION ALL
select 30 deptno, 'TURNER' ename from dual UNION ALL
select 20 deptno, 'ADAMS' ename from dual UNION ALL
select 30 deptno, 'JAMES' ename from dual UNION ALL
select 20 deptno, 'FORD' ename from dual UNION ALL
select 10 deptno, 'MILLER' ename from dual )
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
La syntaxe est assez simple, en 1er paramètre on a la colonne à concaténer et en 2ème on a le séparateur.
La clause WITHIN GROUP() spécifie le tri à appliquer.
La clause OVER() permet de rajouter une partition, comme pour les autres fonctions analytiques.
Liens :
Documentation Oracle sur la fonction
Autres techniques d’agrégation pour les versions antérieures