계층쿼리 0 2 925

by axelhoon [SQL Query] [2022.02.15 15:50:04]


일반적인 회사의 조직과 같은 계층형에서 각 부서에 속한 사원을 구하는 쿼리를 만들고자 합니다.

가장 마지막 레벨은 소속 부서 인원수만 나오면 되고

상위 부서는 하위 부서의 인원수와 해당 상위부서에 속한 인원수의 합을 구하고자합니다.

DBMS : mysql 5.7 version

조언 부탁합니다.

by 마농 [2022.02.15 16:49:22]

mysql 5.7 version 에서는 계층쿼리를 지원하지 않는 것으로 알고 있습니다.
테이블 구조가 코드와  상위코드만 가지고 있다면 접근하기 쉽지 않습니다.
테이블 자체에 직상위 뿐만아니라 전체 계층 상위코드들을 다 가지고 있다던가 하면 좋을 것 같습니다.


by 마농 [2022.02.16 10:24:22]
WITH dept AS
(
SELECT 1000 deptno, 'A' dname, null p_deptno
UNION ALL SELECT 1100, 'B', 1000
UNION ALL SELECT 1110, 'C', 1100
UNION ALL SELECT 1111, 'D', 1110
UNION ALL SELECT 1112, 'E', 1110
UNION ALL SELECT 1200, 'F', 1000
UNION ALL SELECT 1210, 'G', 1200
UNION ALL SELECT 1211, 'H', 1210
UNION ALL SELECT 1212, 'I', 1210
)
, emp AS
(
SELECT 1 empno, 'a' ename, 1000 deptno
UNION ALL SELECT  2, 'b', 1100
UNION ALL SELECT  3, 'c', 1200
UNION ALL SELECT  4, 'd', 1110
UNION ALL SELECT  5, 'e', 1110
UNION ALL SELECT  6, 'f', 1111
UNION ALL SELECT  7, 'g', 1111
UNION ALL SELECT  8, 'h', 1111
UNION ALL SELECT  9, 'i', 1112
UNION ALL SELECT 10, 'j', 1112
UNION ALL SELECT 11, 'k', 1112
UNION ALL SELECT 12, 'l', 1112
UNION ALL SELECT 13, 'm', 1112
UNION ALL SELECT 14, 'n', 1210
UNION ALL SELECT 15, 'o', 1210
UNION ALL SELECT 16, 'p', 1211
UNION ALL SELECT 17, 'q', 1211
)
SELECT d.deptno
     , d.dname
     , COUNT(CASE WHEN d.deptno = e.deptno THEN 1 END) cnt
     , COUNT(e.deptno) cnt_sum
  FROM dept d  -- 조직
 INNER JOIN
       (-- 상위 조직 찾기 : 최대 가능 레벨만큼 조인 추가
        SELECT a.deptno a
             , b.deptno b
             , c.deptno c
             , d.deptno d
--           , e.deptno e
          FROM dept a
          LEFT OUTER JOIN dept b ON a.p_deptno = b.deptno
          LEFT OUTER JOIN dept c ON b.p_deptno = c.deptno
          LEFT OUTER JOIN dept d ON c.p_deptno = d.deptno
--        LEFT OUTER JOIN dept e ON d.p_deptno = e.deptno
        ) x
    ON d.deptno IN ( a, b, c, d
--                 , e
                   )
  LEFT OUTER JOIN emp e  -- 사원
    ON x.a = e.deptno
 GROUP BY d.deptno, d.dname
;

 

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