PARTITION BY 를 이용 decode 해서 보여준것을 한 컬럼으로 0 4 3,342

by 옹네 [2008.10.10 16:01:51]


하는 방법이 없을까요....??

 

DATA

num data
1 a
1 b
1 c
2 d

 

위와같이 테이블에 데이타가 들어있을때

partition by를 이용해서  

num data1 data2 data3
1 a b c
2 d    

sample query)

select num,

          min(decode(r,1,data)) data1,

          min(decode(r,2,data)) data2,

         min(decode(r,3,data)) data3

from ( select num, data, row_number() over(partition by num order by data) r

           from table_name )

group by num

     

위와 같은 결과까지는 얻었는데요...

제가 원하는것은,

num data
1 'a','b','c'
2 'd'

위와 같은 형식이거든요.

위 결과에서 'a','b','c' 를 걍 a,b,c로 나와도 상관없구요...ㅠㅠ

뭔가 좋은 방법이 있을거 같은데. 도무지 모르겠어요.

 

도와주세요...

 

ㅠㅠㅠㅠㅠ

 

 

 

by 마농 [2008.10.10 16:06:47]
위 select 문의 항목들을 컴마로 해서 분리하지 마시고 문자연결함수를 이용해서 연결하시면 되지요.
data1 || ',' || data2 || ',' || data3

by 풍요로운 [2008.10.10 16:09:38]
sys_connect_by_path를 검색하시면 자료가 많이 나올겁니다.
예제도 다양하게 있습니다.

by 옹네 [2008.10.10 16:33:45]
아..죄송...검색해보니 바로 많이 나오네요.

내가 최종적으로 원하던 형식 'a','b','c' 로 출력하려고 할때
잠깐 난관에 봉착... 홑따옴표출력이 또 문제가 되어
잠깐 검색했더니..
혹, 도움이 될까보아 올려봅니다.

chr(39) || data1 || chr(39) 요 형식으로 위에 마농님 답변처럼 연결하면
됩니다.

근데.. sys_connect_by_path로는 어케 해결하나요?
부모자식관계가 없어서 제 능력으론 못하겠어요.

ㅠㅠ

by 삼치 [2008.10.10 17:07:52]
WITH TEST_CONNECT
AS
(
SELECT '1' NUM, 'A' DATA FROM DUAL UNION ALL
SELECT '1' NUM, 'B' DATA FROM DUAL UNION ALL
SELECT '1' NUM, 'C' DATA FROM DUAL UNION ALL
SELECT '2' NUM, 'D' DATA FROM DUAL
)
SELECT NUM,
SUBSTR(MAX(SYS_CONNECT_BY_PATH(DATA, ',')),2)
FROM (
SELECT NUM,
DATA,
ROW_NUMBER() OVER(PARTITION BY NUM ORDER BY DATA) SEQ
FROM TEST_CONNECT
)
START WITH SEQ = 1
CONNECT BY PRIOR SEQ = SEQ - 1
AND PRIOR NUM = NUM
GROUP BY NUM
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입