Разделенный запятыми столбец без 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 у вас есть следующие методы агрегирования строк:
- ROW_NUMBER () и SYS_CONNECT_BY_PATH
- Пользовательская функция STRAGG, продемонстрированная Томом Кайтом, здесь https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
- Собрать функцию в 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;