[SQL]_코드카타_107번

JIYUU·2025년 7월 30일

107번 문제

문제
이 테이블에서 (employee_id, department_id)는 기본 키입니다. (두 컬럼의 조합이 유일한 값을 가짐)

employee_id는 직원의 ID입니다.
department_id는 직원이 소속된 부서의 ID입니다.
primary_flag는 ENUM(범주형) 타입이며 값은 'Y' 또는 'N'입니다.
값이 'Y'이면 해당 부서는 해당 직원의 주 부서입니다.
값이 'N'이면 해당 부서는 주 부서가 아닙니다.

직원은 여러 부서에 소속될 수 있습니다. 직원이 다른 부서에 소속될 때, 어떤 부서를 주 부서로 할지 결정해야 합니다.
단, 직원이 단 하나의 부서에만 소속된 경우, primary_flag 값은 'N'입니다.

요구 사항
모든 직원의 주 부서(primary department)를 조회하는 쿼리를 작성하세요.
직원이 한 부서에만 속한 경우는 그 부서를 주 부서로 간주하여 반환합니다.

결과 테이블은 정렬 순서와 무관합니다.
출력 형식은 다음 예제를 따릅니다.

입력 테이블

employee_iddepartment_idprimary_flag
11N
21Y
22N
33N
42N
43Y
44N

결과

employee_iddepartment_id
11
21
33
43

나의 답

with cnt as(
    select 
        *, 
        count(department_id) over(partition by employee_id) as dept_cnt
    from 
        employee
)
select
    employee_id,
    sum(case when dept_cnt = 1 then department_id
    when dept_cnt > 1 and primary_flag = 'Y' then department_id
    else 0 end) as department_id
from cnt
group by 1;

베스트 답안

select employee_id, department_id
from employee
where primary_flag = 'Y' OR
    employee_id in
    (select employee_id
    from employee
    group by employee_id
    having count(employee_id) = 1);

WHERE절에 IN을 같이 쓰면 되는데 기억이 안났다...꼭 머리속에 기억하자...WHERE IN...

0개의 댓글