WM_CONCAT 함수는 간단하게 사용할 수 있지만 정렬순서가 자기 마음대로 였다.
아래의 예를 보자.
SELECT WM_CONCAT(A.NAME) AS NAMES
FROM
(
SELECT 101 AS KEY, 'A1' AS NAME FROM DUAL
UNION
SELECT 101, 'B2' FROM DUAL
UNION
SELECT 101, 'C3' FROM DUAL
UNION
SELECT 102, 'D4' FROM DUAL
UNION
SELECT 102, 'E5' FROM DUAL
) A
GROUP BY A.KEY
11G 이상부터 사용할 수 있는 LISTAGG 함수는 Order와 Delimeter를 지정 할 수 있어서 좀 더 자유롭게 사용 할 수 있다.
SELECT LISTAGG(A.NAME, ':') WITHIN GROUP(ORDER BY A.NAME) AS NAMES
FROM
(
SELECT 101 AS KEY, 'A1' AS NAME FROM DUAL
UNION
SELECT 101, 'B2' FROM DUAL
UNION
SELECT 101, 'C3' FROM DUAL
UNION
SELECT 102, 'D4' FROM DUAL
UNION
SELECT 102, 'E5' FROM DUAL
) A
GROUP BY A.KEY
위의 그림처럼 구분자와 정렬이 적용된 결과를 볼 수 있다.
그럼...
[p.s.] 10g에서도 LISTAGG 처럼 쓸 수 있는 방법이 있는데... 이건 뭐 함수 같지가 않아서... ^^;
암튼 방법은 아래와 같다.
SELECT SubStr(XMLAGG(XMLELEMENT(x,',',A.NAME) ORDER BY A.NAME).Extract('//text()'), 2) AS NAMES
FROM -- 이하 동일
[출처] 오라클 LISTAGG 간단 설명 및 예제|작성자 뽀우