Запуск конкатенации значений столбцов в oracle sql - PullRequest
1 голос
/ 16 февраля 2020

У меня есть структура таблицы, как показано ниже

create table emp ( empno number,dept_no varchar(4));
insert into emp VALUES  (1,'A');
insert into emp  VALUES (1,'B');
insert into emp  VALUES (1,'C');
insert into emp  VALUES (1,'D');
insert into emp  VALUES (2,'P');
insert into emp  VALUES (2,'Q');
insert into emp  VALUES (2,'R');
insert into emp  VALUES (2,'S');

Мне нужен вывод, как показано ниже

1, A
1, A,B
1, A,B,C
1, A,B,C,D
2, P
2, P,Q
2, P,Q,R
2, P,Q,R,S

Я могу добиться этого с помощью блока PL / SQL, однако есть ли вероятность того, что мы можем достичь этого через sql?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

Это задание для listagg(). К сожалению, хотя она может использоваться как оконная функция, она не поддерживает параметр окна order by, который здесь необходим.

Один из способов обойти это - использовать коррелированный подзапрос:

select 
    e.empno,
    (
            select listagg(e1.dept_no, ',') within group(order by e1.dept_no)
            from emp e1
            where e1.empno = e.empno and e1.dept_no <= e.dept_no            
    ) depts
from emp e

Демонстрация на DB Fiddlde :

EMPNO | DEPTS  
----: | :------
    1 | A      
    1 | A,B    
    1 | A,B,C  
    1 | A,B,C,D
    2 | P      
    2 | P,Q    
    2 | P,Q,R  
    2 | P,Q,R,S
0 голосов
/ 17 февраля 2020

Помимо хорошего ответа от @gmb, вы также можете попробовать следующий вариант, когда таблица будет проходить только один раз.

SELECT empno,
    LTRIM(SYS_CONNECT_BY_PATH(dept_no,','),',') AS employees
FROM   (SELECT dept_no,
               empno,
               ROW_NUMBER() OVER (PARTITION BY empno ORDER BY dept_no) AS curr,
               ROW_NUMBER() OVER (PARTITION BY empno ORDER BY dept_no) -1 AS prev
        FROM   emp)
CONNECT BY prev = PRIOR curr
  AND empno = PRIOR empno
START WITH curr = 1;

Db <> fiddle demo

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...