문제

월별, 국가별로 거래 건수와 총액, 승인된 거래의 수와 승인된 거래의 총액을 찾는 쿼리 작성하기

 

테이블 & 예제

[Transactions]

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

 

[Examples]

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                  |
+----------+---------+-------------+----------------+--------------------+-----------------------+

 

풀이

우선 날짜의 형태를 변경해야한다. 현재는 년-일-월로 되어있으나, 월별 집계를 위해서는 년-월로의 변경이 필요하다.

따라서 DATA_FORMAT함수를 사용하여 이를 수행한다.

DATE_FORMAT(col,"%Y-%m")

 

한가지 조건이 더 숨어있다. 승인여부에 따라서 값의 총 합과, 승인된 거래의 수를 세야한다.

이를 위해서 SUM과 CASE WHEN을 같이 사용해준다. 조건은 state='approved'이다. 값의 총 합을 위해서 조건에 맞는 경우에 amount의 값으로 대체한다.

아래는 전체 코드이다.

SELECT
    DATE_FORMAT(trans_date,"%Y-%m") AS month,
    country,
    COUNT(*) AS trans_count,
    SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM(CASE WHEN state='approved'THEN amount ELSE 0 END) AS approved_total_amount
FROM Transactions
GROUP BY month,country

 

재미난것은 GROUP BY에서 SELECT에서 정의한 별칭을 사용한 것이다.

일반적으로 GROUP BY 후에 SELECT가 수행된다고 알고 있었다. 근데 왜..?

답은 MySQL의 편의 기능이다. MySQL에서 편의를 위해서 SELECT의 별칭을 GROUP BY 절에서도 사용할 수 있도록 해준다고 한다.

성능의 차이는 있을까? GPT는 일반적으로는 성능차이가 크지 않다고 한다. 그러나 기존의 SQL의 방식을 더 권장한다.

+ Recent posts