Агрегация (конкатенация) строковых значений полей с группировкой

Иногда необходимо склеить (сконкатенировать) строковые значения полей возвращаемых запросом в одно значение в соответствии с группировкой по другому полю, сделать это можно как с помощью встроенных Oracle функций так и с помощью своей.

Ниже описание одного способа с использованием встроенной функции wm_concat и ссылки на описание остальных методов.

Имеем следующие входные данные:

Base Data:

    DEPTNO ENAME
---------- ----------
        20 SMITH
        30 ALLEN
        30 WARD
        20 JONES
        30 MARTIN
        30 BLAKE
        10 CLARK
        20 SCOTT
        10 KING
        30 TURNER
        20 ADAMS
        30 JAMES
        20 FORD
        10 MILLER

Desired Output:

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,FORD,ADAMS,SCOTT,JONES
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

Если вы используете Oracle 11g Release 2, то вместо недокументированной и официально не поддерживаемой WM_Concat можно использовать вполне легальную ListAGG, считая, что ее нет? делаем так:

COLUMN employees FORMAT A50
 
SELECT deptno, wm_concat(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
 
3 rows selected.

Получили список сотрудников сгруппированных по отделу в строку через запятую. Основное отличие от оригинальной listagg, в невозможности задать символ разделителя.

Источники:

Оставить комментарий