코딩테스트/SQL

SQL > LeetCode 1907. Count Salary Categories (MySQL)

Porits789 2024. 6. 13. 18:18

문제

Write a solution to calculate the number of bank accounts for each salary category.

The salary categories are:

  • "Low Salary": All the salaries strictly less than $20000.
  • "Average Salary": All the salaries in the inclusive range [$20000, $50000].
  • "High Salary": All the salaries strictly greater than $50000.

The result table must contain all three categories. If there are no accounts in a category, return 0.

Return the result table in any order.

 

문제는 조건에 맞추어서 20000달러, 50000달러를 기준으로 Salary에 해당하는 계정의 수를 찾으면 된다.

 

테이블 & 예제

[Accounts]

+-------------+------+
| Column Name | Type |
+-------------+------+
| account_id  | int  |
| income      | int  |
+-------------+------+
account_id is the primary key (column with unique values) for this table.
Each row contains information about the monthly income for one bank account.

 

[Examples]

Input: 
Accounts table:
+------------+--------+
| account_id | income |
+------------+--------+
| 3          | 108939 |
| 2          | 12747  |
| 8          | 87709  |
| 6          | 91796  |
+------------+--------+
Output: 
+----------------+----------------+
| category       | accounts_count |
+----------------+----------------+
| Low Salary     | 1              |
| Average Salary | 0              |
| High Salary    | 3              |
+----------------+----------------+

 

풀이

풀이 방법은 임시테이블을 만들어서 각 조건에 맞으면 1 틀리면 0을 부여하는 방법으로 진행 후 Union을 사용해서 해당 열의 SUM을 가져왔다.

하나씩 풀이하겠다.

1. 임시테이블을 만들어서 조건에 맞는 값에 1 부여하기

CASE WHEN을 이용해서 만들어주었다.

WITH temp AS (
    SELECT 
        *,
        CASE WHEN income < 20000 THEN 1 ELSE 0 END AS "Low_S",
        CASE WHEN income BETWEEN 20000 AND 50000 THEN 1 ELSE 0 END AS "Average_S",
        CASE WHEN income > 50000 THEN 1 ELSE 0 END AS "High_S"
    FROM Accounts
)
SELECT *
FROM temp

 

결과는 아래와 같다.

| account_id | income | Low_S | Average_S | High_S |
| ---------- | ------ | ----- | --------- | ------ |
| 3          | 108939 | 0     | 0         | 1      |
| 2          | 12747  | 1     | 0         | 0      |
| 8          | 87709  | 0     | 0         | 1      |
| 6          | 91796  | 0     | 0         | 1      |

 

이제 각 열을 행으로 바꾸고, 열별 SUM값을 구하면된다. 이 문제를 포스팅하게 된 계기이기도하다.

 

2. UNION ALL 이용하기

SELECT 문에 데이터를 문자열로 넣고 열의 이름을 지정한 후 이렇게 만들어진 여러 테이블을 UNION을 하면 완성이다! WOW

우선 임시로 테이블을 하나정도 만들어보겠다.

SELECT 'High Salary' AS category, SUM(High_S) AS accounts_count 
FROM temp
| category    | accounts_count |
| ----------- | -------------- |
| High Salary | 3              |

 

SQL 문제를 풀 때 마다 매번 새롭게 배우는 것 같다.

여튼 이렇게 각 Salary마다 테이블을 만들어서 UNION을 해주면 된다.

WITH temp AS (
    SELECT 
        *,
        CASE WHEN income < 20000 THEN 1 ELSE 0 END AS "Low_S",
        CASE WHEN income BETWEEN 20000 AND 50000 THEN 1 ELSE 0 END AS "Average_S",
        CASE WHEN income > 50000 THEN 1 ELSE 0 END AS "High_S"
    FROM Accounts
)
SELECT 'High Salary' AS category, SUM(High_S) AS accounts_count 
FROM temp
UNION ALL
SELECT 'Low Salary' AS category, SUM(Low_S) AS accounts_count 
FROM temp
UNION ALL
SELECT 'Average Salary' AS category, SUM(Average_S) AS accounts_count 
FROM temp