建议不要使用 WM_CONCAT,因为它是一个未记录的功能,并且已从 12c 版本中删除。见Why not use WM_CONCAT function in Oracle?
如果您使用的是 11gR2 及更高版本,请使用 LISTAGG。
对于不支持 LISTAGG 的 11g 之前的版本,您可以使用 ROW_NUMBER() 和 SYS_CONNECT_BY_PATH 函数。
例如,
SELECT deptno,
LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM (SELECT deptno,
ename,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
FROM emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
3 rows selected.