[LeetCode-SQL 50] 1789. Primary Department for Each Employee

코린이·2025년 6월 6일

SQL 문제 풀이 (MySQL)

목록 보기
77/96

❓ 문제

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

(employee_id, department_id)는 이 테이블의 기본 키(고유 값을 가진 열의 조합)입니다.
employee_id는 직원의 ID입니다.
department_id는 직원이 속한 부서의 ID입니다.
primary_flag는 유형('Y', 'N')의 ENUM(카테고리)입니다. 플래그가 'Y'이면 해당 부서가 직원의 기본 부서입니다. 플래그가 'N'이면 해당 부서가 기본 부서가 아닙니다.

직원은 여러 부서에 소속될 수 있습니다. 직원이 다른 부서에 합류할 때는 어느 부서가 기본 부서인지 결정해야 합니다. 직원이 한 부서에만 소속된 경우 기본 열은 'N'입니다.

모든 직원의 기본 부서를 보고하는 솔루션을 작성합니다. 한 부서에 소속된 직원의 경우, 자신의 유일한 부서만 보고합니다.

결과 테이블을 임의의 순서로 반환합니다.

자세한 문제 내용은 사이트 참고...


❗️ 문제 풀이

-- 이중 중첩 쿼리 사용으로 비효율적인 문제 풀이...
-- 하지만 각 구간별 모든 조건 분기 처리함으로 정확도가 높음
-- 인덱스 활용 가능성이 있는 쿼리문 (OR 연산은 인덱스 사용이 떨어짐)
WITH RETURN_TB AS (
	-- 직원 별 소속 부서 count 계산
    WITH TMP_TB AS (
        SELECT
            employee_id
            , COUNT(employee_id) AS CNT
        FROM Employee
        GROUP BY employee_id
    )
    SELECT
        A.employee_id
        , CASE 
            WHEN B.CNT = 1 THEN A.department_id 
            WHEN B.CNT > 1 AND A.primary_flag = 'Y' THEN A.department_id
            ELSE 0 
        END AS department_id
    FROM Employee A JOIN TMP_TB B
        ON A.employee_id = B.employee_id
    GROUP BY A.employee_id, department_id
)
SELECT 
    employee_id
    , department_id
FROM RETURN_TB
WHERE department_id != 0
;




-- 다시 풀어본 문제 풀이
WITH TMP_TB AS (
    SELECT 
        employee_id 
    FROM Employee 
    GROUP BY employee_id 
    HAVING COUNT(employee_id) = 1
)
SELECT 
    employee_id
    , department_id
FROM Employee
WHERE 1=1
    AND primary_flag = 'Y' 
    OR employee_id IN (SELECT employee_id FROM TMP_TB)
;




-- 다시 풀어본 문제 풀이 2
with tmp_tb as (
    select
        employee_id
    from Employee
    group by employee_id
    having count(employee_id) = 1
)
select
    E.employee_id
    , E.department_id
from Employee E left join tmp_tb T
    on E.employee_id = T.employee_id
where T.employee_id is not null or E.primary_flag = 'Y'
;

🔗 Reference

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

0개의 댓글