문제
이 테이블에서 (employee_id, department_id)는 기본 키입니다. (두 컬럼의 조합이 유일한 값을 가짐)
employee_id는 직원의 ID입니다.
department_id는 직원이 소속된 부서의 ID입니다.
primary_flag는 ENUM(범주형) 타입이며 값은 'Y' 또는 'N'입니다.
값이 'Y'이면 해당 부서는 해당 직원의 주 부서입니다.
값이 'N'이면 해당 부서는 주 부서가 아닙니다.
직원은 여러 부서에 소속될 수 있습니다. 직원이 다른 부서에 소속될 때, 어떤 부서를 주 부서로 할지 결정해야 합니다.
단, 직원이 단 하나의 부서에만 소속된 경우, primary_flag 값은 'N'입니다.
요구 사항
모든 직원의 주 부서(primary department)를 조회하는 쿼리를 작성하세요.
직원이 한 부서에만 속한 경우는 그 부서를 주 부서로 간주하여 반환합니다.
결과 테이블은 정렬 순서와 무관합니다.
출력 형식은 다음 예제를 따릅니다.
입력 테이블
| 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 |
결과
| employee_id | department_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 3 |
| 4 | 3 |
나의 답
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...