본문 바로가기

코딩일기

SQL 코드카타 112 - Count Salary Categories

https://leetcode.com/problems/count-salary-categories/description/

 

Column Type
account_id int
income int

 

Accounts 테이블:

  • account_id : 테이블의 고유 키
  • income : 월소득

다음의 급여 범주별로 은행 계좌 수를 계산하는 솔루션을 작성하십시오. 급여 범주는 다음과 같습니다:

"Low Salary": 모든 급여가 $20000 미만인 경우. "Average Salary": 급여가 $20000에서 $50000 범위에 포함되는 경우. "High Salary": 급여가 $50000을 초과하는 경우. 결과 테이블은 세 가지 범주를 모두 포함해야 합니다. 범주에 계정이 없는 경우 0을 반환하십시오.

결과 테이블의 순서는 임의로 해도 됩니다.

 

select
    case
        when income < 20000 then 'Low Salary'
        when income <= 50000 then 'Average Salary'
        else 'High Salary'
    end category
from Accounts

 

먼저 각 데이터를 분류에 맞게 표시를 한다.

 

SELECT 'High Salary' category
UNION ALL
SELECT 'Low Salary'
UNION ALL
SELECT 'Average Salary'

 

각 범주에 맞는 새로운 쿼리를 생성한다.

 

WITH category AS (
    SELECT 'High Salary' category
    UNION ALL
    SELECT 'Low Salary'
    UNION ALL
    SELECT 'Average Salary'
)

 

생성한 쿼리를 기존의 쿼리와 결합하기 위해서 with 구문을 사용해서 묶어준다.

 

select
    case
        when income < 20000 then 'Low Salary'
        when income <= 50000 then 'Average Salary'
        else 'High Salary'
    end category,
    count(*) accounts_count
from Accounts
group by category

 

기존 쿼리를 그룹화하여 그룹별 갯수를 count한다.

 

select *
from category c
left join
(select
    case
        when income < 20000 then 'Low Salary'
        when income <= 50000 then 'Average Salary'
        else 'High Salary'
    end category,
    count(*) accounts_count 
from Accounts
group by category) accounts_count on c.category = accounts_count.category

 

두 쿼리를 결합한다.

 

WITH category AS (
    SELECT 'High Salary' category
    UNION ALL
    SELECT 'Low Salary'
    UNION ALL
    SELECT 'Average Salary'
)

select
    c.category,
    COALESCE(accounts_count.accounts_count, 0) accounts_count
from category c
left join
(select
    case
        when income < 20000 then 'Low Salary'
        when income <= 50000 then 'Average Salary'
        else 'High Salary'
    end category,
    count(*) accounts_count 
from Accounts
group by category) accounts_count on c.category = accounts_count.category

 

마지막으로 필요한 null값을 0으로 대체해서 출력하도록 하면 완료!

 

성공!