1907. 급여 범주 계산 / LeetCode, SQL, MS SQL Server

문제

출처: 리트코드

각 급여 범주의 은행 계좌 수를 보고하는 SQL 쿼리를 작성하십시오. 급여 범주는 다음과 같습니다.
“낮은 급여”: 모든 급여가 $20000 미만입니다.”평균 급여”:

포괄 범위의 모든 급여($20000, $50000).”높은 급여”:

모든 급여는 $50000 이상입니다.

결과 테이블에는 세 가지 범주가 모두 포함되어야 합니다. 범주에 계정이 없으면 0을 보고합니다.
순서에 상관없이 결과 테이블을 반환합니다.


제출(MS SQL 서버)

WITH
    ls_cat
        AS (SELECT category
            FROM (VALUES ('Low Salary'), ('Average Salary'), ('High Salary')) AS categories(category)),

    acc_cat
        AS (SELECT 
                account_id, 
                income, 
                CASE 
                    WHEN income BETWEEN 20000 AND 50000 THEN 'Average Salary'
                    WHEN income > 50000 THEN 'High Salary'
                    ELSE 'Low Salary' END AS category
            FROM
                accounts)

SELECT
    cat.category,
    ISNULL(grp.accounts_count, 0) AS accounts_count
FROM
    ls_cat AS cat
    LEFT JOIN (SELECT category, COUNT(account_id) AS accounts_count
                FROM acc_cat
                GROUP BY category) AS grp
        ON cat.category = grp.category

솔루션(MS SQL 서버)

더보기

CTE 1: 범주 이름을 포함하는 열 만들기

WITH
    ls_cat
        AS (SELECT category
            FROM (VALUES ('Low Salary'), ('Average Salary'), ('High Salary')) AS categories(category)),

>> VALUES를 사용하여 가상 테이블 생성

>> 가상 테이블에서 괄호 안에 범주를 포함할 열의 별칭을 입력합니다.

CTE2: 계정별로 카테고리 입력

    acc_cat
        AS (SELECT 
                account_id, 
                income, 
                CASE 
                    WHEN income BETWEEN 20000 AND 50000 THEN 'Average Salary'
                    WHEN income > 50000 THEN 'High Salary'
                    ELSE 'Low Salary' END AS category
            FROM
                accounts)

메인 쿼리

SELECT
    cat.category,
    ISNULL(grp.accounts_count, 0) AS accounts_count
FROM
    ls_cat AS cat
    LEFT JOIN (SELECT category, COUNT(account_id) AS accounts_count
                FROM acc_cat
                GROUP BY category) AS grp
        ON cat.category = grp.category

>> ls_cat(CTE1)을 기반으로 조인합니다. 범주가 모두 표시되어야 하기 때문입니다.

>> Accounts 테이블에 특정 카테고리에 대한 값이 없으면 NULL이 되므로 NULL이 발생하면 ISNULL을 사용하여 0으로 변환한다.

>> acc_cat(CTE2)를 카테고리별로 그룹화한 후 ls_cat(CTE1)과 매칭

문제로 이동(MS SQL Server)