동적으로 보실려면... 이 방법으로 0 2 4,496

by 호야 SYS_CONNECT_BY_PATH INSTR 행열변환 [2008.11.25 15:44:37]


TB_CODE 테이블
CODE VALUE
SAL01 개인
SAL02 법인
SAL03 회원

TB_SALE 테이블
NAME MASTER_CODE
김테스터 SAL01^SAL02
한테스터 SAL03^SAL02

 

WITH TB_CODE AS(
SELECT ’SAL01’ CODE,’개인’ VALUE FROM DUAL
UNION ALL
SELECT ’SAL02’ CODE,’법인’ VALUE FROM DUAL
UNION ALL
SELECT ’SAL03’ CODE,’회원’ VALUE FROM DUAL
), TB_SALE AS(
SELECT ’김테스터’ NAME,’SAL01^SAL02’ MASTER_CODE FROM DUAL
UNION ALL
SELECT ’한테스터’ NAME,’SAL03^SAL02’ MASTER_CODE FROM DUAL
UNION ALL
SELECT ’호테스터’ NAME,’SAL02^SAL01^SAL03’ MASTER_CODE FROM DUAL
)
SELECT B.NAME,SUBSTR((MAX(SYS_CONNECT_BY_PATH(A.VALUE,’,’))),2) VALUE
FROM TB_CODE A,
(SELECT NAME,M_CODE,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) RN
FROM (SELECT DISTINCT RN,LEVEL,NAME,
               SUBSTR (STR,INSTR (STR, BASE, 1, LEVEL) + LEN,INSTR (STR, BASE, 1, LEVEL + 1)
                       - INSTR (STR, BASE, 1, LEVEL)- LEN) M_CODE
      FROM (SELECT NAME,ROWNUM RN, ’^’ BASE, ’^’ || MASTER_CODE || ’^’ STR,LENGTH (’^’) LEN
            FROM TB_SALE)
            CONNECT BY LEVEL <=(LENGTH (STR) - LENGTH (REPLACE (STR, BASE)))/ LEN- 1)) B
WHERE A.CODE=B.M_CODE
START WITH RN=1
CONNECT BY PRIOR RN=RN-1
GROUP BY NAME

쿼리 조건: 1. TB_CODE 테이블이 계속 3개 일꺼라는 확신도 없다(계속 늘거나 줄어듬)
                    2. TB_SALE 테이블의 MASTER_CODE가 1개~ N개로 변할 수도 있다.

위와 같은 조건을 두었을 ㅤㄸㅒㅤ 이렇게 데이터를 풀어서 조인을 한 다음 묶어 주는 형식을 취합니다.

즉, TB_SALE 테이블을 하나 하나 행으로 나눈뒤에... TB_CODE와 조인을 합니다.

그리고 마지막으로 SYS_CONNECT_BY_PATH 로 묶어 주는 방법입니다.

다른 형님들이 더 좋은 의견을 내 주실꺼예요^^; 수고하세욤 

결과---------------------------------------

NAME             VALUE
---------------- ---------------
김테스터         회원,법인
한테스터         회원,법인
호테스터         회원,법인,회원

by 손님 [2008.11.25 19:39:37]
호야님 정말 감사합니다. 오라클을 잘 몰랐는데 많은 도움이 되었네요.
그런데 한가지만 더 여쭤볼께요. 위에 쿼리대로 해서 확인해봤는데요.
개념은 이해가 가는데 VALUE값이 틀리게 나오거든요. 음 제 생각에는 고유한 회원의 VALUE가 나오질 않고 전체적인 VALUE에서 MAX값으로 묶여서 갯수대로 가져오는거 같아요. 제가 아직 내공이 부족해서 어떻게 수정을 해야할지 모르겠네요..ㅠ.ㅠ.. 다시 한번 도움 부탁드립니다.

by 호야 [2008.11.26 09:17:49]
아..^^; CONNECT BY 를 하는 무조건 RN=1 인 놈을 찾아서.. 자료가
엉망이 되었을 겁니다...
밑에서 2번?? 줄을 이렇게 고치세요
CONNECT BY PRIOR RN=RN-1 AND PRIOR NAME = NAME
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입