[LeetCode-SQL 50] 1907. Count Salary Categories

코린이·2025년 6월 11일

SQL 문제 풀이 (MySQL)

목록 보기
82/96

❓ 문제

Accounts
+-------------+------+
| Column Name | Type |
+-------------+------+
| account_id  | int  |
| income      | int  |
+-------------+------+

account_id는 이 테이블의 기본 키(고유 값을 가진 열)입니다.
각 행에는 한 은행 계좌의 월 소득에 대한 정보가 들어 있습니다.

각 급여 범주에 대한 은행 계좌의 수를 계산하는 솔루션을 작성합니다. 급여 범주는 다음과 같습니다:

"Low Salary": 모든 급여가 $20000 미만입니다.
"Average Salary": 포함 범위[$20000, $50000]의 모든 급여입니다.
"High Salary": $50000보다 엄격하게 큰 모든 급여.
결과 테이블에는 세 가지 카테고리가 모두 포함되어야 합니다. 한 카테고리에 계정이 없는 경우 0을 반환합니다.

결과 테이블은 어떤 순서로든 반환합니다.

자세한 문제 내용은 사이트 참고...


❗️ 문제 풀이

-- 무지성 UNION 사용 문제 풀이

SELECT 
    'Low Salary' AS category
    , COUNT(account_id) AS accounts_count
FROM Accounts
WHERE income < 20000

UNION

SELECT 
    'Average Salary' AS category
    , COUNT(account_id) AS accounts_count
FROM Accounts
WHERE income BETWEEN 20000 AND 50000

UNION

SELECT 
    'High Salary' AS category
    , COUNT(account_id) AS accounts_count
FROM Accounts
WHERE income > 50000
;




-- 가상 테이블 생성 방식
-- 오히려 가독성도 떨어지고, 성능 부분에서 큰 차이가 없음
-- 굳이 따지면 아래 쿼리가 조금 더 성능이 좋음(Accounts 1회 스캔)
WITH TMP_TB1 AS (
    SELECT
        account_id,
        CASE 
            WHEN income < 20000 then 'Low Salary'
            WHEN income > 50000 then 'High Salary'
            ELSE 'Average Salary'
        END AS category
    FROM Accounts
), TMP_TB2 AS (
    SELECT 'Low Salary' AS category
    UNION ALL
    SELECT 'Average Salary'
    UNION ALL
    SELECT 'High Salary'
)
SELECT
    A.category
    , COUNT(B.account_id) AS accounts_count
FROM TMP_TB2 A LEFT JOIN TMP_TB1 B
    ON A.category = B.category
GROUP BY A.category
;

🔗 Reference

https://leetcode.com/problems/count-salary-categories/?envType=study-plan-v2&envId=top-sql-50

0개의 댓글