질문
----------------------------------
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
보면 데이터를 XMLELMENT로 바꾼 다음에 그걸 XMLAGG로 싸준 방식이다.
이런 식으로 하면 데이터는 아래와 같이 나온다.
01, 03, 05, 08
그런데 오라클이 10인지 11인지가 되면서 함수가 하나 생겼다.
바로 WM_CONCAT인데 아주 강력하다.
SELECT SUBSTR(REPLACE(XMLAGG(XMLELEMENT("nm", ', ' || COLUMN1)).EXTRACT('//text()').GetStringVal(), ', , ', NULL), 3)
이 부분을
SELECT WM_CONCAT(COLUMN1) FROM TABLE1;
이렇게만 변경하면 바로 원하는 결과 값이 나온다.
---------------------------------------------------------------------------------------------
오라클 클럽에서 아주 제대로 된 예제를 봐서 추가로 올린다.