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를 표현할 수 있다
'SQL > 문제풀이' 카테고리의 다른 글
[LeetCode] immediate-food-delivery-ii (0) | 2024.03.05 |
---|---|
[LeetCode] average-selling-price 📌 (0) | 2024.03.05 |
[LeetCode] students-and-examinations 📌 (0) | 2024.03.04 |
[LeetCode] confirmation-rate (0) | 2024.03.04 |
[LeetCode] average-time-of-process-per-machine (0) | 2024.03.04 |