[내용수정]계층형 부서정보 쿼리 보완좀 해주세요 0 9 1,802

by Kyle [2016.10.21 11:29:59]


계층 구조로 되어 있는 부서정보를 펼쳐줘야 할일이 있습니다.

1   ㄱㄱ부서
    1.1 ㄴㄴ부서
        1.1.1   ㄷㄷ부서
            1.1.1.1 ㅈㅈ부서
2   ㄹㄹ부서
    2.1 ㅁㅁ부서
        2.1.1   ㅅㅅ부서
            2.1.1.1 ㅇㅇ부서
                2.1.1.1.1   ㅊㅊ부서

위와같은 부서 정보이며 depth 는 최장 5level 까지 있고, 최단 4단계 까지 입니다.
최단 4level 부서의 경우 5level 이 null 이기 때문에 4level 부서 정보를 5level에 채워 줘야 합니다.

최단 4level 부서의 경우 5level 이 null 이기 때문에 3level 부서 정보를 4level에 , 4level 부서 정보를 5level에 채워 줘야 합니다.

고민 끝에 아래와 같은 쿼리를 작성했으니 왠지 깔끔해 보이지 않고 찜찜한 느낌이네요
아래 쿼리를 좀더 깔끔하게 수정 할 방법이 있을까요?


TN_CMN_DEP  부서정보 테이블
TN_CMN_DEP.DEP_CD   부서코드
TN_CMN_DEP.PRT_ORG_CD   상위부서코드

원하는 결과는

전체부서명,                                    LEVEL1, LEVEL2, LEVEL3,  LEVEL4,    LEVEL5
ㄱㄱ부서 ㄴㄴ부서 ㄷㄷ부서 ㅈㅈ부서              1      1.1    1.1.1    1.1.1   1.1.1.1
ㄹㄹ부서 ㅁㅁ부서 ㅅㅅ부서 ㅇㅇ부서 ㅊㅊ부서     2      2.1    2.1.1    2.1.1.1   2.1.1.1.1


조언좀 부탁드립니다.

    SELECT
        FULL_NM,
        DEP_CD,
        DEP_NM,
        PRT_ORG_CD,
        LV,
        CBI,
        (SELECT DEP_CD FROM TN_CMN_DEP WHERE LEVEL = DECODE(LV, 5, 4, 4, 3, 3, 2) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DC2,
        (SELECT DEP_NM FROM TN_CMN_DEP WHERE LEVEL = DECODE(LV, 5, 4, 4, 3, 3, 2) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DN2,
        (SELECT DEP_CD FROM TN_CMN_DEP WHERE LEVEL = DECODE(LV, 5, 3, 4, 2, 3, 1) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DC3,
        (SELECT DEP_NM FROM TN_CMN_DEP WHERE LEVEL = DECODE(LV, 5, 3, 4, 2, 3, 1) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DN3,
        (SELECT DEP_CD FROM TN_CMN_DEP WHERE LEVEL = DECODE(CBI, 0, DECODE(LV, 5, 2, 4, 1), 1, DECODE(LV, 5, 2, 4, 2)) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DC4,
        (SELECT DEP_NM FROM TN_CMN_DEP WHERE LEVEL = DECODE(CBI, 0, DECODE(LV, 5, 2, 4, 1), 1, DECODE(LV, 5, 2, 4, 2)) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DN4,
        (SELECT DEP_CD FROM TN_CMN_DEP WHERE LEVEL = DECODE(CBI, 1, DECODE(LV, 5, 1, 4, 1)) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DC5,
        (SELECT DEP_NM FROM TN_CMN_DEP WHERE LEVEL = DECODE(CBI, 1, DECODE(LV, 5, 1, 4, 1)) START WITH DEP_CD = A.DEP_CD CONNECT BY  DEP_CD = PRIOR PRT_ORG_CD) DN5
    FROM (
        SELECT
            'ㅇㅇ그룹' || SUBSTR(H_NM, INSTR(H_NM, ' ', 8)) FULL_NM,
            DEP_CD,
            DEP_NM,
            PRT_ORG_CD,
            LV,
            CBI
        FROM (
            SELECT 
                SUBSTR(SYS_CONNECT_BY_PATH(DEP_NM, ' '), 2) H_NM, 
                DEP_CD, 
                DEP_NM,
                PRT_ORG_CD,
                LEVEL LV,
                CONNECT_BY_ISLEAF CBI
            FROM TN_CMN_DEP
            WHERE LEVEL > 2
            START WITH PRT_ORG_CD IS NULL
            CONNECT BY PRIOR DEP_CD =  PRT_ORG_CD
            ORDER SIBLINGS BY PRT_ORG_CD
        )
    ) A

 

by 마농 [2016.10.21 14:14:56]

최종 결과가 2건만 나오면 되는 건가요?

결과가 더 나와야 한다면? 다 보여 주세요 어떻게 나와야 하는지.


by Kyle [2016.10.21 14:40:17]

원하는 결과와 같은 형식으로 전체 부서 목록이 나오는 겁니다.

좀더 자세하게 설명을 드리면 현재 있는 개발자 들이 계층형 쿼리에 약하다 보니

제일 말단부서코드(5level)로 상위 부서(2~3 level)부서 조회에 어려움이 있어

전체부서에 대해서 한row 에 1level 에서 5level 까지 부서 정보를 모두 보여 주려는게

목적입니다.

최종적으로는 위에 쿼리로 view 테이블을 만들려 합니다.


by 마농 [2016.10.21 15:02:05]
예시 기준으로 2건만 나오면 되는지를 물어본거에요.

by 마농 [2016.10.21 15:20:16]

계속 질문하는 이유는...
원본 대비 결과표가 정확했으면 좋겠어서 그래요.
최초 질문의 원본 자료 9건 중에 결과자료는 몇건이 나와야 하는지?
=== 원본 ===
1   ㄱㄱ부서
    1.1 ㄴㄴ부서
        1.1.1   ㄷㄷ부서
            1.1.1.1 ㅈㅈ부서
2   ㄹㄹ부서
    2.1 ㅁㅁ부서
        2.1.1   ㅅㅅ부서
            2.1.1.1 ㅇㅇ부서
                2.1.1.1.1   ㅊㅊ부서
=== 결과 ===
???
 


by Kyle [2016.10.21 15:24:00]

아님니다. 제 3자의 입장에서 설명을 해야 하는데 좀 부족한듯하네요

위에 첨부한 것과 같이 나오기를 원하고 부서가 9개 이니 총 9개의 ROW 가 나와야 겠죠...^^


by 마농 [2016.10.21 15:25:13]

=== 원본 ===
1   ㄱㄱ부서
    1.1 ㄴㄴ부서
        1.1.1   ㄷㄷ부서
            1.1.1.1 ㅈㅈ부서
2   ㄹㄹ부서
    2.1 ㅁㅁ부서
        2.1.1   ㅅㅅ부서
            2.1.1.1 ㅇㅇ부서
                2.1.1.1.1   ㅊㅊ부서
=== 결과 ===
9줄 모두 정확하게 적어 주세요.

모호한 설명만으로는 부족합니다.


by Kyle [2016.10.21 15:31:04]
전체부서명,                                    LEVEL1, LEVEL2, LEVEL3,  LEVEL4,    LEVEL5
ㄱㄱ부서                                        1
ㄱㄱ부서 ㄴㄴ부서                               1      1.1
ㄱㄱ부서 ㄴㄴ부서 ㄷㄷ부서                      1      1.1    1.1.1
ㄱㄱ부서 ㄴㄴ부서 ㄷㄷ부서 ㅈㅈ부서             1      1.1    1.1.1    1.1.1   1.1.1.1
ㄹㄹ부서                                        2
ㄹㄹ부서 ㅁㅁ부서                               2      2.1
ㄹㄹ부서 ㅁㅁ부서 ㅅㅅ부서                      2      2.1    2.1.1
ㄹㄹ부서 ㅁㅁ부서 ㅅㅅ부서 ㅇㅇ부서             2      2.1    2.1.1    2.1.1.1
ㄹㄹ부서 ㅁㅁ부서 ㅅㅅ부서 ㅇㅇ부서 ㅊㅊ부서    2      2.1    2.1.1    2.1.1.1   2.1.1.1.1

이상 9줄 입니다.


by 마농 [2016.10.21 15:47:02]
WITH tn_cmn_dep AS
(
SELECT '1' dep_cd, 'ㄱㄱ부서' dep_nm, '' prt_org_cd FROM dual
UNION ALL SELECT '1.1'      , 'ㄴㄴ부서', '1'       FROM dual
UNION ALL SELECT '1.1.1'    , 'ㄷㄷ부서', '1.1'     FROM dual
UNION ALL SELECT '1.1.1.1'  , 'ㅈㅈ부서', '1.1.1'   FROM dual
UNION ALL SELECT '2'        , 'ㄹㄹ부서', ''        FROM dual
UNION ALL SELECT '2.1'      , 'ㅁㅁ부서', '2'       FROM dual
UNION ALL SELECT '2.1.1'    , 'ㅅㅅ부서', '2.1'     FROM dual
UNION ALL SELECT '2.1.1.1'  , 'ㅇㅇ부서', '2.1.1'   FROM dual
UNION ALL SELECT '2.1.1.1.1', 'ㅊㅊ부서', '2.1.1.1' FROM dual
)
SELECT nm
     , REGEXP_SUBSTR(cd, '[^ ]+', 1, 1) lv1
     , REGEXP_SUBSTR(cd, '[^ ]+', 1, 2) lv2
     , REGEXP_SUBSTR(cd, '[^ ]+', 1, 3) lv3
     , REGEXP_SUBSTR(cd, '[^ ]+', 1, 4-x) lv4
     , REGEXP_SUBSTR(cd, '[^ ]+', 1, 5-x) lv5
  FROM (SELECT dep_cd, dep_nm, prt_org_cd
             , SYS_CONNECT_BY_PATH(dep_cd, ' ') cd
             , SYS_CONNECT_BY_PATH(dep_nm, ' ') nm
             , CASE WHEN LEVEL = 4 AND CONNECT_BY_ISLEAF = 1
                    THEN 1 ELSE 0 END x
          FROM tn_cmn_dep
         START WITH prt_org_cd IS NULL
         CONNECT BY PRIOR dep_cd = prt_org_cd
        )
;

 


by Kyle [2016.10.21 16:06:26]

하~~~ 허망하네요

이렇게 간단하게 끝낼수 있는걸 상위부서 정보를 찾으려면 꼭 트래버스 해야 한다고 생각해버려서

마농님 처럼 PATH 에서 자르면 될것을 ... ㅎ

감사합니다. 많은 도움됐습니다.^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입