질문
----------------------------------
select t.corp_cd, t.engineer_nm from mantb_engineer t order by t.corp_cd
//회사코드, 엔지니어 이름 을 회사코드에 맞게 정렬해서 아래와 같은 결과가 나왔습니다.

     코드   엔지니어
1 A05308 박박박
2 A05308 김김김
3 A05308 최최최
4 A05308 민민민
5 A05308 이이이
6 A05308 마마마
7 A05308 차차차
8 A06182 박박박
9 A06182 김김김
10 A06187 최최최
11 A09141 윤윤윤
12 A09141 민민민

이 내용을 코드별로 그룹정렬해서 엔지니어 이름을 붙여서 정렬하고자 합니다.
ex) A05308  박박박 김김김 최최최 민민민 이이이 마마마 차차차
----------------------------------

==================================
답변
----------------------------------
SELECT corp_cd,
       LTRIM(SYS_CONNECT_BY_PATH(engineer_nm,','),',') engineer_nm
  FROM
(
  SELECT ROW_NUMBER() OVER (PARTITION BY corp_cd ORDER BY engineer_nm ) NUM
       , corp_cd
       , engineer_nm
       , COUNT(*) OVER (PARTITION BY corp_cd) gCnt
    FROM mantb_engineer
)
 WHERE LEVEL = gCnt
 START WITH NUM=1
 CONNECT BY PRIOR corp_cd = corp_cd
     AND PRIOR NUM = NUM-1


아래와 같이 정렬됩니다..
한 컬럼에 모든것을 이으실려면 컬럼간에 문자열 결합인자를 사용하시면 됩니다.
corp_cd || LTRIM(SYS_CONNECT_BY_PATH(engineer_nm,','),',')
응용해서 원하는 결과를 얻으시기를~~~

     코드               엔지니어
1  A05308  박박박, 김김김, 최최최, 민민민, 이이이, 마마마, 차차차
2  A06182  박박박, 김김김
3  A06187  최최최
4  A09141  윤윤윤, 민민민

ORDER BY 구문이 없으면 ERROR가 나네요 추가해서 수정했습니다.


 ------------------------------

2012년 10월 29일 추가

SELECT 한 데이터를 세로로 아닌 가로로 표현해야 될 때가 있다. 

그런 경우에 사용하는 쿼리이다.

     WITH TABLE1 AS

    (
      SELECT '01' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '03' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '05' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '08' AS COLUMN1 FROM dual
    )
     
    SELECT SUBSTR(REPLACE(XMLAGG(XMLELEMENT("nm", ', ' || COLUMN1)).EXTRACT('//text()').GetStringVal(), ', , ', NULL), 3)
      FROM TABLE1;

보면 데이터를 XMLELMENT로 바꾼 다음에 그걸 XMLAGG로 싸준 방식이다.

이런 식으로 하면 데이터는 아래와 같이 나온다.

01, 03, 05, 08

그런데 오라클이 10인지 11인지가 되면서 함수가 하나 생겼다.

바로 WM_CONCAT인데 아주 강력하다.

 SELECT SUBSTR(REPLACE(XMLAGG(XMLELEMENT("nm", ', ' || COLUMN1)).EXTRACT('//text()').GetStringVal(), ', , ', NULL), 3)
      FROM TABLE1;

이 부분을

SELECT WM_CONCAT(COLUMN1) FROM TABLE1;

이렇게만 변경하면 바로 원하는 결과 값이 나온다.

---------------------------------------------------------------------------------------------
오라클 클럽에서 아주 제대로 된 예제를 봐서 추가로 올린다.

WITH t(type, name,code) AS
(
SELECT 'A', '사과', '0' FROM dual
UNION ALL SELECT 'A', '레몬', '1' FROM dual
UNION ALL SELECT 'A', '포도', '2' FROM dual
UNION ALL SELECT 'A', '참외', '3' FROM dual
)
SELECT type
     , SUBSTR(XMLAgg(XMLElement(x, ',', name) ORDER BY code).Extract('//text()'), 2) name_9i
     , SUBSTR(XMLAgg(XMLElement(x, ',', code) ORDER BY code).Extract('//text()'), 2) code_9i
     , wm_concat(name) name_10g
     , wm_concat(code) code_10g
     , ListAgg(name, ',') WITHIN GROUP(ORDER BY code) name_11g
     , ListAgg(code, ',') WITHIN GROUP(ORDER BY code) code_11g
  FROM t
 GROUP BY type
;

블로그 이미지

요다할아범

,