여러가지로 생각을 하다가 좋은 방법을 알고 계시는 분들이 있을거 같아..
질문을 드립니다.
원본데이터
WITH TT(TERM_ID,UP_TERM_ID,TERM_NM,TERM_CONT_TYPE_CD,TERM_CONT) AS ( SELECT 'TM001', 'TOP', '정보수집및이용동의', '100', 'NULL' FROM DUAL UNION ALL SELECT 'TM002', 'TM001', '모든 채널 수신에 동의합니다.', '100', 'NULL' FROM DUAL UNION ALL SELECT 'TM003', 'TM002', 'E-MAIL', '100', '1' FROM DUAL UNION ALL SELECT 'TM004', 'TM002', 'SMS', '100', '1' FROM DUAL UNION ALL SELECT 'TM005', 'TM002', 'TM', '100', '1' FROM DUAL UNION ALL SELECT 'TM006', 'TM002', 'DM', '100', '1' FROM DUAL UNION ALL SELECT 'TM007', 'TM001', '개인정보 이용 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM008', 'TM001', '고유식별정보 처리 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM009', 'TM001', '통신사 이용약관 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM010', 'TM001', '서비스 이용약관 동의(필수)', '200', '내용' FROM DUAL ) SELECT * FROM TT ;
출력형태
LV | TERM_ID | UP_TERM_ID | TERM_NM | TERM_CONT_TYPE_CD | TERM_CONT | SMS | TM | DM | |
1 | TM001 | TOP | 정보수집및이용동의 | 100 | 0 | 0 | 0 | 0 | |
2 | TM002 | TM001 | 모든 채널 수신에 동의합니다. | 100 | 1 | 1 | 1 | 1 | |
2 | TM007 | TM001 | 개인정보 이용 동의(필수) | 200 | 내용 | 0 | 0 | 0 | 0 |
2 | TM008 | TM001 | 고유식별정보 처리 동의(필수) | 200 | 내용 | 0 | 0 | 0 | 0 |
2 | TM009 | TM001 | 통신사 이용약관 동의(필수) | 200 | 내용 | 0 | 0 | 0 | 0 |
2 | TM010 | TM001 | 서비스 이용약관 동의(필수) | 200 | 내용 | 0 | 0 | 0 | 0 |
설명
원본데이터와 같이 제귀호출 형태의 데이터가 있습니다.
데이터중 TERM_CONT_TYPE_CD가 100 이면서 계층구조의 최하위 레벨로 들어가게 되는
E-MAIL, SMS, TM, DM 값을 PIVOT으로 붙여 주고 싶습니다.
해당 데이터가 없는 경우는 0으로 찍어 줍니다.
감사합니다.
SELECT MIN ( term_id ) term_id , MIN ( up_term_id ) up_term_id , MIN ( DECODE ( LEVEL, 3, NULL, term_nm ) ) term_nm , MIN ( term_cont_type_cd ) term_cont_type_cd , MIN ( term_cont ) term_cont , COUNT ( DECODE ( term_nm, 'E-MAIL', 1 ) ) email , COUNT ( DECODE ( term_nm, 'SMS' , 1 ) ) sms , COUNT ( DECODE ( term_nm, 'TM' , 1 ) ) tm , COUNT ( DECODE ( term_nm, 'DM' , 1 ) ) dm FROM tt a START WITH term_cont_type_cd = '100' AND up_term_id = 'TOP' CONNECT BY PRIOR term_id = up_term_id GROUP BY DECODE ( LEVEL, 3, PRIOR term_id, term_id ) ORDER BY term_id
DarkBee님의 좋은 의견으로 마무리 했습니다.
다만 계층구조의 최하위 레벨이 3레벨이 아닐 수 있기 때문에 아래와 같이 바꿔봤습니다.
다시 한번 감사합니다.
WITH TT(TERM_ID,UP_TERM_ID,TERM_NM,TERM_CONT_TYPE_CD,TERM_CONT) AS ( SELECT 'TM001', 'TOP', '정보수집및이용동의', '100', NULL FROM DUAL UNION ALL SELECT 'TM002', 'TM001', '모든 채널 수신에 동의합니다.', '100', NULL FROM DUAL UNION ALL SELECT 'TM003', 'TM002', 'E-MAIL', '100', '1' FROM DUAL UNION ALL SELECT 'TM004', 'TM002', 'SMS', '100', '1' FROM DUAL UNION ALL SELECT 'TM005', 'TM002', 'TM', '100', '1' FROM DUAL UNION ALL SELECT 'TM006', 'TM002', 'DM', '100', '1' FROM DUAL UNION ALL SELECT 'TM007', 'TM001', '개인정보 이용 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM008', 'TM001', '고유식별정보 처리 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM009', 'TM001', '통신사 이용약관 동의(필수)', '200', '내용' FROM DUAL UNION ALL SELECT 'TM010', 'TM001', '서비스 이용약관 동의(필수)', '200', '내용' FROM DUAL ) SELECT MIN ( term_id ) term_id , MIN ( up_term_id ) up_term_id , MAX ( term_nm ) term_nm , MAX ( term_cont_type_cd ) term_cont_type_cd , MAX ( term_cont ) term_cont , COUNT ( DECODE ( term_nm, 'E-MAIL', 1 ) ) email , COUNT ( DECODE ( term_nm, 'SMS' , 1 ) ) sms , COUNT ( DECODE ( term_nm, 'TM' , 1 ) ) tm , COUNT ( DECODE ( term_nm, 'DM' , 1 ) ) dm FROM tt a START WITH up_term_id = 'TOP' CONNECT BY PRIOR term_id = up_term_id GROUP BY DECODE(CONNECT_BY_ISLEAF,1,DECODE(TERM_CONT_TYPE_CD,'100',UP_TERM_ID,TERM_ID),TERM_ID) ORDER BY term_id ;