SQL/문제풀이

[LeetCode] monthly-transactions

응엉잉 2024. 3. 4. 16:28

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

 

Monthly Transactions I - LeetCode

Can you solve this real interview question? Monthly Transactions I - Table: Transactions +---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | country | varchar | | state | enum | | amount | int | | trans_date | date

leetcode.com

DATE_FORMAT 함수로 원하는 형태의 날짜(년-월)를 만들어주고 COALESCE 이용해서 NULL인 경우 0이 나오게 바꿔주면 그렇게 풀기 어려운 문제는 아니라고 생각했는데 ... !!

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

wow ... 내 접근방식이 진짜 구렸나보다

 

Solution에서 가장 많이 조회된 쿼리는 다음과 같다.

SELECT SUBSTR(trans_date, 1, 7) 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 month, country

 

1. 꼭 값을 가져오지 않아도 되는, 카운팅 하는 상황의 경우 특정 케이스에 해당되면 1, 아니면 0 으로 조건을 짠 후 SUM을 해주면 더 빨라지는거같다

2. ELSE 0 처럼 ELSE에 대한 처리를 해줘야 처리 속도가 빨라진다

3. SUBSTR 함수를 이용해서 month를 표현할 수 있다