관련있는 값들의 DATA 그룹핑 질문 0 3 1,266

by 슈엔 고급 SQL [2012.09.29 13:09:49]


오리지날  메인 대치
A B C
A C B
D B C
E D A
X Y Z

설명)
첫번째 줄이 원래는 'A' 이지만 주로 'B'를 사용하고 대치는 'C'이다.
그런데 세번째 줄처럼 'B'와 'C'가 'D'의 메인과 대치가  등로되어있으므로 결국 'A', 'B', 'C'는
서로 대치 가능하다, 네번째줄도 역시 대치가능함. 즉, A, B, C, D, E가 서로간에 대치가 가능하므로
한개의 ROW로 추출되어야 함.

결과값은 하기와 같이 2개의 ROW가 되어야 함.   이게 쿼리로 가능한가요..???

A B C D E
X Y Z    

by 마농 [2012.10.02 09:28:15]
WITH t AS
(
SELECT 1 pk, 'A' c1, 'B' c2, 'C' c3 FROM dual
UNION ALL SELECT 2, 'A', 'C', 'B' FROM dual
UNION ALL SELECT 3, 'D', 'B', 'C' FROM dual
UNION ALL SELECT 4, 'E', 'D', 'A' FROM dual
UNION ALL SELECT 5, 'X', 'Y', 'Z' FROM dual
)
SELECT DISTINCT WM_CONCAT(DISTINCT DECODE(lv, 1, c1, 2, c2, 3, c3)) result
  FROM (SELECT DISTINCT c1, c2, c3
             , CONNECT_BY_ROOT(pk) pk
          FROM t
         CONNECT BY NOCYCLE PRIOR c1 IN (c1, c2, c3)
                         OR PRIOR c2 IN (c1, c2, c3)
                         OR PRIOR c3 IN (c1, c2, c3)
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
 GROUP BY pk
 ORDER BY result
;

by 슈엔 [2012.10.02 12:35:04]

마농님 답변 갑사합니다.....
근데, 저희쪽은 오라클10g 임에도 'WM_CONCAT'함수가 사용이 안되게 되어있네요.
정책상 막혀있는듯 합니다... 혹, 다른 방법은 없겠죠.?ㅠㅠ

by 마농 [2012.10.02 13:34:34]
WITH t AS
(
SELECT 1 pk, 'A' c1, 'B' c2, 'C' c3 FROM dual
UNION ALL SELECT 2, 'A', 'C', 'B' FROM dual
UNION ALL SELECT 3, 'D', 'B', 'C' FROM dual
UNION ALL SELECT 4, 'E', 'D', 'A' FROM dual
UNION ALL SELECT 5, 'X', 'Y', 'Z' FROM dual
)
SELECT DISTINCT
       SUBSTR(XMLAGG(XMLELEMENT(x, ',', x) ORDER BY x).EXTRACT('//text()'), 2) x
  FROM (SELECT DISTINCT pk
             , DECODE(lv, 1, c1, 2, c2, 3, c3) x
          FROM (SELECT DISTINCT c1, c2, c3
                     , CONNECT_BY_ROOT(pk) pk
                  FROM t
                 CONNECT BY NOCYCLE PRIOR c1 IN (c1, c2, c3)
                                 OR PRIOR c2 IN (c1, c2, c3)
                                 OR PRIOR c3 IN (c1, c2, c3)
                )
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
        )
 GROUP BY pk
 ORDER BY x
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입