728x90
🗂️ 문제
[SQL50] 1193. Monthly Transactions I (AGGREGATE)
✍🏻 풀이
문제 해석
주어진 Transactions 테이블에서 월별, 국가별로 각 query_name에 대해 다음을 계산하는 문제
- trans_count
- 전체 거래 수
- approved_count
- 승인된 거래 수
- state = 'approved'인 거래 수만 count
- trans_total_amount
- 전체 거래 금액 합
- approved_total_amount
- state = 'approved'인 거래 금액 합
코드
WITH all_trans AS (
-- 모든 거래에 대한 집계
SELECT
country,
SUM(1) AS all_trans_cnt,
SUM(amount) AS all_trans_amount,
-- 아래 코드는 PostgreSQL
TO_CHAR(trans_date, 'YYYY-MM') AS month
-- MySQL에서는 TO_CHAR이 아닌 DATE_FORMAT을 써야한다.
-- MySQL : DATE_FORMAT(trans_date, '%Y-%m') AS month
FROM Transactions
GROUP BY country, month
),
approved AS (
-- 승인된 거래에 대한 집계
SELECT
country,
SUM(1) AS approved_cnt,
SUM(amount) AS approved_amount,
TO_CHAR(trans_date, 'YYYY-MM') AS month
FROM Transactions
WHERE state = 'approved'
GROUP BY country, month
)
-- 모든 거래와 승인된 거래를 연결하여 최종 결과 반환
SELECT
A.month AS month,
A.country AS country,
A.all_trans_cnt AS trans_count,
COALESCE(B.approved_cnt, 0) AS approved_count,
A.all_trans_amount AS trans_total_amount,
COALESCE(B.approved_amount, 0) AS approved_total_amount
FROM
all_trans A LEFT JOIN approved B
ON COALESCE(A.country, 'NULL') = COALESCE(B.country, 'NULL')
AND A.month = B.month;
풀이 방식
Table : all_trans
country | all_trans_cnt | all_trans_amount | month |
US | 3 | 3000 | 2018-12 |
US | 1 | 2000 | 2019-01 |
DE | 1 | 2000 | 2019-01 |
Table : approved
country | approved_cnt | approved_amount | month |
US | 1 | 1000 | 2018-12 |
US | 1 | 2000 | 2019-01 |
DE | 1 | 2000 | 2019-01 |
- WITH로 모든 거래, 승인된 거래에 대해서 country, month를 GROUP BY로 묶은 임시 테이블을 생성한다.
- 1에서 생성한 임시 테이블을 country, month가 같은 것을 기준으로 JOIN하여 답을 도출한다.
COALESCE
country에 null 값이 들어올 수 있으므로 이를 처리하기 위해 사용
https://youngone-kang.tistory.com/52
[SQL] COALESCE
COALESCECOALESCE() 함수는 여러 개의 인자 중에서 NULL이 아닌 첫 번째 값을 반환하는 함수→ 값이 NULL일 경우 대체 값을 설정할 때 유용하다.기본COALESCE(value1, value2, ..., valueN)왼쪽부터 차례대로 NULL
youngone-kang.tistory.com
728x90
'coding_test > SQL 문제' 카테고리의 다른 글
[LeetCode] 550. Game Play Analysis IV (AGGREGATE) (0) | 2025.03.14 |
---|---|
[LeetCode] 1211. Queries Quality and Percentage (AGGREGATE) (0) | 2025.02.11 |
[LeetCode] 1633. Percentage of Users Attended a Contest (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 1075. Project Employees I (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 1251. Average Selling Price (AGGREGATE) (0) | 2025.02.10 |