본문 바로가기

SQL/LeetCode&HackerRank

[MySQL] Leetcode - 1907. Count Salary Categories

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

나의 풀이:

select category
     , count(*) as accounts_count
from (
    select case when income < 20000 then 'Low Salary'
                when income > 50000 then 'High Salary'
                else 'Average Salary' 
            end as category
        , account_id
    from accounts) sub
group by category

근데 이렇게 하면 틀림!!

왜냐하면 문제는 케이스에 해당하는 값이 없을 경우에 0값을 보고싶은 건데

이렇게 하면 카운트 할 수 없는 카테고리는 결과값에서 제외가 된다 ㅜㅜ

 

없는 카테고리도 띄우는 방법! 

SELECT 'Low Salary' AS category
       , SUM(income < 20000 AS accounts_count 
FROM Accounts

UNION

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

UNION

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

각자 만들어서 유니언하기 쿸스..

이때 sum 안에 조건이 들어가있는데, 이 경우에 결과값이 boolean으로 반환이 된다 true - 1, false - 0으로!

그래서 해당하는 인원수를 셀 수 있으면서 아무도 없으면 0을 볼 수 있다 

호오옹

 

또다른 방법

WITH c AS (SELECT 'Low Salary' AS category
           UNION
           SELECT 'Average Salary'
           UNION
           SELECT 'High Salary' )
, t AS (select
            case when income < 20000 then 'Low Salary'
                 when income > 50000 then 'High Salary'
                 else 'Average Salary' end
            as category,
            count(1) as cnt
        from Accounts
        group by 1)
SELECT c.category, IFNULL(t.cnt,0) AS accounts_count
FROM c
     LEFT JOIN t using(category)
ORDER BY 2 DESC

 

c 위드문에서 from 없이 저렇게 select를 할 수 있다는 걸 이번에 처음 알았당,, 싕기

c 에서 카테고리만 존재하는 테이블을 따로 만들고

t 에서 수입별로 카테고리 분류하고 몇명인지 카운트한 테이블을 만든 후 

마지막에 카테고리에 레프트 조인시켜주면 된다!

레프트조인을 해야 없는 카테고리에 카운트값으로 null이 들어가서

이프널 처리를 0으로 해주면 원하는 결과값 완성~~