최대 1 분 소요

문제 링크

정답

WITH Ranges AS (
  SELECT 0 AS LowerLimit, 19999 AS UpperLimit, 'Low Salary' AS category UNION ALL
  SELECT 20000, 50000, 'Average Salary' UNION ALL
  SELECT 50001, 999999999, 'High Salary'
)

SELECT R.category, COUNT(A.account_id) accounts_count
FROM Accounts A
RIGHT JOIN Ranges R
ON A.income BETWEEN R.LowerLimit AND R.UpperLimit
GROUP BY R.category

✅ Point

  • 특정 범위를 만족하는 row의 개수 구하기
    • 특정 범위를 만족하는 row가 없다면 0으로 처리
      • CASE WHEN + COUNT 와 함께 sub query로 사용한다면 > 조건에 맞는 row 가 없으면 column도 사라지는 문제 발생
  • 따라서 원하는 범위를 별도로 명시적으로 만들어 놓고, JOIN해야 count값이 0인 경우에도 column을 살릴 수 있음
    • with 와 select를 여러 번 union all 하여 범위 설정
    • 해당 범위를 만족하는지를 기준으로 JOIN
    • 범위가 사라지지 않게 RIGHT JOIN