SQL/문제풀이
[LeetCode] monthly-transactions
응엉잉
2024. 3. 4. 16:28
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를 표현할 수 있다