Разделенный запятыми столбец без XML-пути

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

ID Name
1  a
1  b
1  c
2  d
2  e
3  f

Я хотел бы получить результат как

ID Name
1  a,b,c
2  d,e
3  f

Я не хочу использовать какие-либо XMLPATH или же coalesce функции. Просто в простом запросе SQL мне нужно получить ожидаемый результат.

2 ответа

Решение

Так как вы на Oracle 10g версия, вы не можете использовать LISTAGG, Это было введено в 11g,

И, пожалуйста, НЕ используйте WM_CONCAT, поскольку это недокументированная функция, которая была удалена из последней версии. Посмотрите, почему wm_concat не работает здесь?

Для 10g у вас есть следующие методы агрегирования строк:

  1. ROW_NUMBER () и SYS_CONNECT_BY_PATH
  2. Пользовательская функция STRAGG, продемонстрированная Томом Кайтом, здесь https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
  3. Собрать функцию в PL/SQL

Ниже приведен метод чистого SQL, использующий ROW_NUMBER() а также SYS_CONNECT_BY_PATH функции, доступные с 9i:

SQL> column emp_list format a50
SQL> SELECT deptno,
  2         LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
  3         KEEP (DENSE_RANK LAST ORDER BY cur),',') AS emp_list
  4  FROM   (SELECT deptno,
  5                 ename,
  6                 ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS cur,
  7                 ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
  8          FROM   emp)
  9  GROUP BY deptno
 10  CONNECT BY prev = PRIOR cur AND deptno = PRIOR deptno
 11  START WITH cur = 1;

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

SQL>

В Oracle 10 вы можете использовать неофициальную функцию WM_CONCAT для этого. В более поздних версиях вы будете использовать LISTAGG.

select id, wm_concat(name)
from mytable
group by id;
Другие вопросы по тегам