WITH cte as (SELECT account_id, income,
CASE
WHEN income < 20000 THEN 'Low Salary'
WHEN income >= 20000 AND income < 50000 THEN 'Average Salary'
ELSE 'High Salary'
END AS 'category'
FROM Accounts)
SELECT category, count(*) as accounts_count
FROM cte
GROUP BY
category
이렇게 작성하면 문제가 CASE에 해당하는 레코드가 없을 경우,
category를 그룹화해서 카운팅할 때, 참조할 요소가 cte에 아예 없기 때문에 그 행 자체가 보이지를 않는다. high salary에 해당하는 레코드가 없었다면 cte에서 group by해도 그에 대한 값 자체를 불러올 수 없는 것이다.
WITH cte as (SELECT account_id, income,
CASE
WHEN income < 20000 THEN 'Low Salary'
WHEN income BETWEEN 20000 AND 50000 THEN 'Average Salary'
ELSE 'High Salary'
END AS 'category'
FROM Accounts),
emp as (SELECT 'High Salary' as category
UNION ALL
SELECT 'Average Salary'
UNION ALL
SELECT 'Low Salary'),
fin as (SELECT e.category, c.income
FROM emp e LEFT JOIN cte c
ON e.category = c.category)
SELECT category, COALESCE(count(income), 0) as accounts_count
FROM fin
GROUP BY
category
빈 테이블을 만들어서 LEFT JOIN 하면 카테고리가 사라지지 않는다.
아니면 빈 테이블이 아니라 각 항목을 직접 센 후에, UNION ALL로 다 통합시켜도 된다.
중복이 없을 것이기 때문에 UNION보다는 UNION ALL이 더 빨리 돌아간다.