본문 바로가기

코딩일기

SQL 코드카타 106 - The Number of Employees Which Report to Each Employee

https://leetcode.com/problems/the-number-of-employees-which-report-to-each-employee/description/

 

Column Name Type
employee_id int
name varchar
reports_to int
age int

 

Employees 테이블:

  • employee_id: 직원의 고유 식별자
  • name: 직원의 이름
  • reports_to: 해당 직원이 보고하는 매니저의 employee_id (nullable)
  • age: 직원의 나이

매니저들의 employee_id와 이름, 그들에게 직접 보고하는 직원 수, 해당 직원들의 평균 나이(가장 가까운 정수로 반올림)를 보고하는 쿼리를 작성해야 합니다. 결과는 employee_id로 정렬되어야 합니다.

 

select
    reports_to,
    count(reports_to) reports_count ,
    round(avg(age)) average_age 
from Employees
where reports_to is not null
group by reports_to

 

먼저 매니저별로 보고 받는 사람들의 평균 나이와 보고하는 사람들의 수를 구한다.

 

select
    E.employee_id,
    E.name,
    managed.reports_count,
    managed.average_age
from Employees E inner join
(
select
    reports_to,
    count(reports_to) reports_count ,
    round(avg(age)) average_age 
from Employees
where reports_to is not null
group by reports_to
) managed on E.employee_id  = managed.reports_to

 

서브쿼리에서 group by된 reports_to는 메인쿼리의 employee_id와 같으므로 두 열을 기준으로 결합해준다. 그리고 필요한 데이터만 select해주면 된다.

 

select
    E.employee_id,
    E.name,
    managed.reports_count,
    managed.average_age
from Employees E inner join
(
select
    reports_to,
    count(reports_to) reports_count ,
    round(avg(age)) average_age 
from Employees
where reports_to is not null
group by reports_to
) managed on E.employee_id  = managed.reports_to
order by E.employee_id

 

마지막으로 employee_id를 기준으로 정렬해주면 완료!

끝!