Algorithm/문제 풀이

[LeetCode] 1193 - Monthly Transactions I

비번변경 2025. 4. 3. 00:20

문제

문제 : https://leetcode.com/problems/monthly-transactions-i/description/?envType=study-plan-v2&envId=top-sql-50

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| country       | varchar |
| state         | enum    |
| amount        | int     |
| trans_date    | date    |
+---------------+---------+

id는 테이블의 PK이고, 이 테이블은 들어오는 트랜잭션에 대한 정보를 가지고 있다.

state 컬럼은 approved 또는 declined라는 값을 가질 수 있는 enum 타입이다.

 

월 별, 국가 별 거래 수와 총액, 승인된 거래 수와 승인된 총액을 구하는 쿼리를 작성하라.

 

예시 )

Input: 
Transactions table:
+------+---------+----------+--------+------------+
| id   | country | state    | amount | trans_date |
+------+---------+----------+--------+------------+
| 121  | US      | approved | 1000   | 2018-12-18 |
| 122  | US      | declined | 2000   | 2018-12-19 |
| 123  | US      | approved | 2000   | 2019-01-01 |
| 124  | DE      | approved | 2000   | 2019-01-07 |
+------+---------+----------+--------+------------+
Output: 
+----------+---------+-------------+----------------+--------------------+-----------------------+
| month    | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
+----------+---------+-------------+----------------+--------------------+-----------------------+
| 2018-12  | US      | 2           | 1              | 3000               | 1000                  |
| 2019-01  | US      | 1           | 1              | 2000               | 2000                  |
| 2019-01  | DE      | 1           | 1              | 2000               | 2000                  |
+----------+---------+-------------+----------------+--------------------+-----------------------+

 

 

 

풀이

승인된 거래의 수와 총액을 구할 때 CASE 문을 사용하여 state 값이 approved이면 1 또는 amount를, 그 외에는 0으로 지정한 뒤 합을 구한다.

# Write your MySQL query statement below
SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month
     , country
     , COUNT(id) AS trans_count
     , SUM(CASE state WHEN 'approved' THEN 1 ELSE 0 END) AS approved_count
     , SUM(amount) AS trans_total_amount 
     , SUM(CASE state WHEN 'approved' THEN amount ELSE 0 END) AS approved_total_amount 
FROM Transactions
GROUP BY country, month

 

 

다른 풀이

조건식의 결과값이 1 또는 0인 점을 활용한다. 승인된 총액을 구할 때는 state = 'approved' 결과에 amount를 곱한 값의 합으로 한다.

SELECT 
    LEFT(trans_date, 7) AS month,
    country, 
    COUNT(id) AS trans_count,
    SUM(state = 'approved') AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM((state = 'approved') * amount) AS approved_total_amount
FROM 
    Transactions
GROUP BY 
    month, country;

 

+ 거의 CASE WHEN 방식을 많이 사용했어서 기억할 겸 적어둔다.

 

 

참고 문서

https://leetcode.com/problems/monthly-transactions-i/description/?envType=study-plan-v2&envId=top-sql-50

 

728x90