부서별 관리자 LEVEL 출력 0 1 647

by naverTT [2020.11.02 20:56:13]


상하위부서 계층형 출력 관련하여 문의 드립니다.

 

DEPTCODE

DEPTNAME

P_DEPTCODE

SEQ

00100

총괄부

00000

0

00003 

  생산부

00100

20

00124 

   전산팀

00003

10

00125

   생산팀

00003

10

01028

     운영지원

00125

40

00004

  인사부

00100

20

DEPT_TABLE 부서테이블(SEQ는 하위부서가 숫자가 더 낮을수도 있음.)

 

DEPTCODE

USERID

00100

A001

00100 

B001

00003

B002

01028

A002

01028

C003

ADMIN_TABLE 부서별 관리자 테이블(한 부서당 여러명의 담당자가 존재할 수 있음.)

 

 

USERID

USERNAME

A001

shelley

A002

susan

B001

david

B002

hann

C003

bruce

USER_TABLE 관리자정보 테이블

 

추출하고자 하는 데이터 형태

LEVEL

DEPTCODE

DEPTNAME

SEQ

USERID

USERNAME

1

00100

총괄부

0

A001

shelley

1

00100

총괄부

0

B001

david

2

00003

  생산부

20

B002

hann

3

00124

   전산팀

10

 

 

3

00125

   생산팀

10    

4

01028

      운영지원 40

A002

susan

4

01028

      운영지원 40

C003

bruce

00004

   인사부 20    

 

LEVEL은 유지하면서 USERID 가 여러개일 경우에 같이 출력될 수 있는 방법이 무엇이 있나요?

DEPT_TABLE에 LEVEL을 주고, 그 후에 USER_TABLE을 조인했더니

LEVEL이 흐트러집니다 ㅠㅠ 

도움 부탁 드립니다.

by 마농 [2020.11.03 08:27:22]

1. ROWNUM 으로 정렬하시면 됩니다.
2. seq 의 역할이 있는지 모르겠네요?
 - 정렬용이라면? 같은 부모를 가진 자식끼리 값이 달라야 할텐데? 그렇지도 않고?

WITH dept_table AS
(
SELECT '00100' deptcode, '총괄부' deptname, '00000' p_deptcode, 0 seq FROM dual
UNION ALL SELECT '00003', '생산부'  , '00100', 20 FROM dual
UNION ALL SELECT '00124', '전산팀'  , '00003', 10 FROM dual
UNION ALL SELECT '00125', '생산팀'  , '00003', 10 FROM dual
UNION ALL SELECT '01028', '운영지원', '00125', 40 FROM dual
UNION ALL SELECT '00004', '인사부'  , '00100', 20 FROM dual
)
, admin_table AS
(
SELECT '00100' deptcode, 'A001' userid FROM dual
UNION ALL SELECT '00100', 'B001' FROM dual
UNION ALL SELECT '00003', 'B002' FROM dual
UNION ALL SELECT '01028', 'A002' FROM dual
UNION ALL SELECT '01028', 'C003' FROM dual
)
, user_table AS
(
SELECT 'A001' userid, 'shelley' username FROM dual
UNION ALL SELECT 'A002', 'susan'   FROM dual
UNION ALL SELECT 'B001', 'david'   FROM dual
UNION ALL SELECT 'B002', 'hann'    FROM dual
UNION ALL SELECT 'C003', 'bruce'   FROM dual
)
SELECT a.lv
     , a.deptcode
     , a.deptname
     , a.p_deptcode
     , a.seq
     , b.userid
     , c.username
  FROM (SELECT ROWNUM rn
             , LEVEL lv
             , deptcode
             , LPAD(' ', LEVEL-1, ' ') || deptname deptname
             , p_deptcode
             , seq
          FROM dept_table
         START WITH p_deptcode = '00000'
         CONNECT BY PRIOR deptcode = p_deptcode
         ORDER SIBLINGS BY deptcode
        ) a
     , admin_table b
     , user_table  c
 WHERE a.deptcode = b.deptcode(+)
   AND b.userid   = c.userid(+)
 ORDER BY a.rn, b.userid
;

 

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