SELECT employee_id,
(CASE WHEN count(department_id) > 1 AND primary_flag = 'Y' THEN department_id
WHEN count(department_id) = 1 THEN department_id END) as department_id
FROM Employee
GROUP BY employee_id
ORDER BY employee_id
| 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 | null |
count와 같은 집계 함수는 제대로 기능하지만 primary_flag = 'Y'라는 비교문에 대해서 group by로 압축했을 때는 제대로 비교하지 못하고 느슨한 sql에서는 첫 행으로 압축하고 비교한 이후 맞지 않으면 null로 처리한다.
window 함수를 사용해도 되지만 집계 함수를 이용해서 풀어보려고 한다.
SELECT employee_id,
COALESCE(
MAX(CASE WHEN primary_flag = 'Y' THEN department_id END),
MAX(department_id)
) as department_id
FROM Employee
GROUP BY employee_id
ORDER BY employee_id
NULL, 3, NULL 이렇게 리스트가 있다고 할 때, 그대로 출력하게 되면 첫 번째 레코드를 확인하면서 NULL을 출력한다. 여기서 MAX, MIN 함수를 사용하면 유일한 값인 3을 뽑아낼 수 있다. 집계 함수는 NULL을 취급하지 않기 때문에 3만 뽑히게 되는 것이다.