문제
+---------------+---------+
| 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 방식을 많이 사용했어서 기억할 겸 적어둔다.
참고 문서
728x90