문제: 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으로 해주면 원하는 결과값 완성~~
'SQL > LeetCode&HackerRank' 카테고리의 다른 글
[MySQL] Leetcode - 585. Investments in 2016 (0) | 2024.02.05 |
---|---|
[MySQL] Hackerrank - Occupations (1) | 2024.01.30 |
[MySQL] Leetcode - 601. Human Traffic of Stadium (0) | 2024.01.29 |
[MySQL] Leetcode - 1045. Customers Who Bought All Products (0) | 2024.01.29 |
[MySQL] HackerRank - SQL Project Planning (0) | 2024.01.22 |