Algorithm/문제 풀이

[LeetCode] 1789 - Primary Department for Each Employee

비번변경 2025. 3. 21. 16:27

문제

문제 : https://leetcode.com/problems/primary-department-for-each-employee/?envType=study-plan-v2&envId=top-sql-50

다음과 같은 스키마를 가진 테이블 Employee가 존재한다.

+---------------+---------+
| Column Name   |  Type   |
+---------------+---------+
| employee_id   | int     |
| department_id | int     |
| primary_flag  | varchar |
+---------------+---------+

employee_id는 직원의 ID이고,  department_id는 직원이 속한 부서의 ID이다. employee_id, department_id는 primary key이다. primary_flag는 'Y', 'N' 값을 가지는 ENUM 형 컬럼으로, Y이면 직원의 주 부서라는 의미이고, N이면 직원의 주 부서가 아니라는 의미이다. 

직원은 여러 부서에 소속될 수 있으나, 어느 부서가 주 부서인지 결정해야 한다. 만약 직원이 하나의 부서에만 소속되어 있을 경우에는 primary_flag가 N이다.

이 때 모든 직원의 주 부서를 확인하는 쿼리문을 작성하라. 

 

예시 )

Input: 
Employee table:
+-------------+---------------+--------------+
| employee_id | department_id | primary_flag |
+-------------+---------------+--------------+
| 1           | 1             | N            |
| 2           | 1             | Y            |
| 2           | 2             | N            |
| 3           | 3             | N            |
| 4           | 2             | N            |
| 4           | 3             | Y            |
| 4           | 4             | N            |
+-------------+---------------+--------------+
Output: 
+-------------+---------------+
| employee_id | department_id |
+-------------+---------------+
| 1           | 1             |
| 2           | 1             |
| 3           | 3             |
| 4           | 3             |
+-------------+---------------+

 

 

풀이

처음에는 그룹 연산을 활용해서 처리하려고 했으나, 생각보다 잘 되지 않아서 UNION을 사용해 풀이했다.

풀이 방법은 다음과 같다.

 

1. 소속된 부서가 하나인 직원 정보 조회

SELECT employee_id
     , department_id 
  FROM Employee
 GROUP BY employee_id
HAVING COUNT(department_id) = 1

 

2. 여러 부서에 소속된 직원 정보 조회

SELECT employee_id
     , department_id 
  FROM Employee
 WHERE TRUE
   AND primary_flag = 'Y'

 

3. 두 정보를 하나의 테이블로 합친다.

SELECT employee_id
     , department_id 
  FROM Employee
 GROUP BY employee_id
HAVING COUNT(department_id) = 1
UNION
SELECT employee_id
     , department_id 
  FROM Employee
 WHERE TRUE
   AND primary_flag = 'Y'

 

 

다른 풀이

또는 조건절에 서브쿼리를 사용하는 방법이 존재한다.

조건절에 primary_flag가 Y이거나, employee_id가 직원 별 부서 수가 1인 employee_id에 포함되어 있는 경우를 조회하면 된다.

SELECT employee_id
     , department_id 
  FROM Employee
 WHERE TRUE
   AND (primary_flag = 'Y'
    OR employee_id IN (SELECT employee_id 
                         FROM Employee 
                        GROUP BY employee_id 
                       HAVING COUNT(department_id) = 1
                       )
   )
 ORDER BY employee_id

 

 

참고 문서

https://leetcode.com/problems/primary-department-for-each-employee/description/?envType=study-plan-v2&envId=top-sql-50

 

 

728x90