Fonction LISTAGG

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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>