programing

관리자 아래의 직원 수를 가져오기 위한 중첩 쿼리

itsource 2023. 1. 17. 21:26
반응형

관리자 아래의 직원 수를 가져오기 위한 중첩 쿼리

create table employee (
Id int,
ManagerId int);

insert into employee values
(1, 3),
(2, 3),
(3, 6),
(4, 7),
(5, 7),
(6, 8),
(7, 6);

select * from employee;

표는 다음과 같습니다.

여기에 이미지 설명 입력

종업원 수가 많은 매니저에게 질문서를 작성하는 방법중첩된 구조를 확인합니다.위의 예에 대한 결과는 다음과 같습니다.

Id | number_of_employees
3  | 2
7  | 2
6  | 6
8  | 7

여기 있어요!!

With recursive cte as (
     select id,Managerid from employee  --> Anchor Query
     union all
     select c.Id,e.ManagerId from cte c --> Recursive Member
     join employee e on (c.ManagerId=e.Id)) --> Termination Condition
select ManagerId,count(Id) as Number_of_Employees
from cte group by ManagerId

데모

갱신하다

알았어, 내가 설명해줄게.

우선, 매니저와 매니저의 부하를 톱 레벨(모든 조합)까지 리스트 한 표를 생성해 둘 필요가 있습니다.아래가 되겠죠?이것을 결과표라고 부릅니다.

-------------------------
|   Id  |   ManagerId   |
-------------------------
|   1   |       3       |--
|   2   |       3       |  |
|   3   |       6       |  |
|   4   |       7       |  |->From your table
|   5   |       7       |  |
|   6   |       8       |  |
|   7   |       6       |-- 
|   2   |       6       |--
|   1   |       6       |  |
|   7   |       8       |  |
|   3   |       8       |  |
|   5   |       6       |  |-> Nested structure which you meant in the question
|   4   |       6       |  |
|   4   |       8       |  |
|   5   |       8       |  |
|   1   |       8       |  |
|   2   |       8       |--
-------------------------

위의 표를 얻으면 다음 정보를 얻을 수 있습니다.count사용.group by부장님아이디. 그럼 어떻게 해야 되지?

1) 직접 종업원을 고용할 수 있습니다.

select Id,ManagerId from employee -- let's call this as QueryE1

2) 이제 같은 테이블에서 1급 매니저와 종업원을 모시겠습니다.

select e1.Id,e2.ManagerId from employee e1 join employee e2 on e1.managerid = e2.id     
--QueryE2
-------------------------
|   Id  |   ManagerId   |
-------------------------
|   1   |       6       |
|   2   |       6       |
|   3   |       8       |
|   7   |       8       |
|   4   |       6       |
|   5   |       6       |
-------------------------

3) 상기 표를 참조표(QueryE2)로 간주하여 직원표와 연계하여 직원과 함께 2급 관리자를 파악한다.여기서 8은 6의 관리자이기 때문에 6의 모든 보고자는 8의 보고자이기도 합니다.

SELECT e3.id,e4.managerid 
FROM   (SELECT e1.id,e2.managerid 
        FROM employee e1 JOIN employee e2 
                 ON e1.managerid = e2.id) e3 
JOIN employee e4 
ON e3.managerid = e4.id -- QueryE3

-------------------------
|   Id  |   ManagerId   |
-------------------------
|   1   |       8       |
|   2   |       8       |
|   4   |       8       |
|   5   |       8       |
-------------------------

4) 매니저가 없어질 때까지 상기 절차를 반복한다.이제 우리는 8명의 매니저가 없다는 것을 안다.하지만 쿼리가 무엇을 말하는지 봅시다.이제 최신 표(위)를 참고 표로 고려해야 합니다.

SELECT e5.id,e6.managerid 
FROM   (SELECT e3.id,e4.managerid 
        FROM   (SELECT e1.id,e2.managerid 
                FROM   employee e1 
                       JOIN employee e2 
                         ON e1.managerid = e2.id) e3 
        JOIN employee e4 
        ON e3.managerid = e4.id) e5 
JOIN employee e6 
ON e5.managerid = e6.id  --QueryE4-- returns 0 rows as well

마지막으로 이 모든 쿼리의 값을 모두 조합하면 필요한 결과 테이블을 얻을 수 있습니다.이 모든 것은 우리에 의해 행해졌다.RECURSIVE CTE1개의 쿼리에서요.여기서QueryE1는 Anchor Query 입니다. QueryE2,QueryE3 & QueryE4재귀 멤버는 0행까지 CTE에 의해 작성됩니다.결과 테이블이 생성되면 이를 사용하여 요구를 맞춤화할 수 있습니다.하고 있습니다Group by을 손에 넣다count매니저의아이디. 혼란이 해소될지는 모르겠지만 적어도 아이디어를 얻기를 바랍니다.

언급URL : https://stackoverflow.com/questions/58796003/nested-query-to-get-number-of-employees-under-managers

반응형