코딩테스트/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