오랑우탄의 반란

LeetCode 리트코드 | 1193. Monthly Transactions I (MySQL) 본문

SQL/LeetCode

LeetCode 리트코드 | 1193. Monthly Transactions I (MySQL)

5&2 2024. 7. 11. 14:28
반응형

 

오늘도 오랑이는 문제를 풉니다.

 

1193. Monthly Transactions I

 

풀이 과정

우선 간단한 조건부터 정리해서 써줍니다.

select date_format(trans_date ,'%Y-%m') as month, country, 
        count(id) as trans_count, 
        /*QUERY*/ as approved_count, 
        sum(amount) as trans_total_amount, 
        /*QUERY*/ as approved_total_amount
from transactions
group by 1, 2 ;

 

approved_count 와 approved_total_amount 는 각각 state = 'approved' 라는 조건이 필요한데, 전체 쿼리에 이걸 적용하게 되면 위에서 구한 trans_count, trans_total_amount 계산값과 동일해집니다.

그렇기 때문에 각각 case when 을 사용해서 맞다면 1 과 amount 를 리턴하도록 조건문을 달아줍니다. 

조건문을 sum으로 묶어줘서 최종 개수와 합을 출력하도록 합니다.

sum(case when state = 'approved' then 1 else 0 end) as approved_count
sum(case when state = 'approved' then amount else 0 end) as approved_total_amount

 

최종 코드

select date_format(trans_date ,'%Y-%m') as month, country, 
        count(id) 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 1, 2 ;

 

다른 풀이도 살펴봅시다.

아래는 window function 을 사용한 풀이입니다.

window function을 잘 쓰지 않아 가물가물한데 다시 복습해야겠습니다. 

#Approach 3-Window Function 

SELECT 
    DATE_FORMAT(trans_date ,'%Y-%m') AS month,
    country,
    COUNT(id) AS trans_count,
    SUM(amount) AS trans_total_amount,
    CASE WHEN state = 'approved' THEN COUNT(id) OVER (PARTITION BY SUBSTR(trans_date, 1, 7), country) ELSE 0 END AS approved_count,
    CASE WHEN state = 'approved' THEN SUM(amount) OVER (PARTITION BY SUBSTR(trans_date, 1, 7), country) ELSE 0 END AS approved_total_amount
FROM 
    Transactions;

 

 

오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

https://leetcode.com/problems/monthly-transactions-i/description/

반응형