본문 바로가기

SQL/LeetCode

[SQL] Monthly Transactions I(LeetCode/Oracle)

안녕하세요!

 

이번 포스팅은 LeetCode에 있는 Monthly Transactions I 문제를 OracleDB로 풀어보려고 합니다!

 

(모든 문제는 Oracle로 풀이하겠습니다.)

 

1. 문제 링크 : https://leetcode.com/problems/monthly-transactions-i/description/

 

2. 문제

Column name Type
id int
country varchar
state enum
amount int
trans_date date
[문제] Write an SQL query to find for each month and country, the number of transactions and their total amount, the number of approved transactions and their total amount.

각 월 및 국가별, 트랜잭션 수 및 총 금액, 승인된 트랜잭션 수 및 총 금액을 조회하는 문제입니다.

 

3. 제출 쿼리 및 설명

 

1) 승인된 트랜잭션을 따로 조회합니다.

SELECT * 
FROM TRANSACTIONS 
WHERE STATE = 'approved'

2) 원본 테이블 Transactions와 1번 쿼리를 LEFT JOIN 합니다. 

LEFT JOIN 하는 이유는 트랜잭션 수나 금액이 없다고 해도 조인이 될 수 있어야 합니다.

 

FROM TRANSACTIONS T, (SELECT * FROM TRANSACTIONS WHERE STATE = 'approved') A
WHERE T.ID = A.ID(+)

최종) 년월, 국가 별로 그룹화해서 트랜잭션 수, 총 금액을 구하고, 승인된 트랜잭션 수, 총 금액을 조회합니다.

여기에서 집계 결과가 없더라도 결과는 0으로 나올 수 있도록 NVL 함수를 사용해서 NULL 값을 처리합니다.

SELECT 
    TO_CHAR(T.TRANS_DATE, 'YYYY-MM') AS MONTH, T.COUNTRY,
    COUNT(T.ID) AS TRANS_COUNT,
    COUNT(A.ID) AS APPROVED_COUNT,
    NVL(SUM(T.AMOUNT), 0) AS TRANS_TOTAL_AMOUNT,
    NVL(SUM(A.AMOUNT), 0) AS APPROVED_TOTAL_AMOUNT
FROM TRANSACTIONS T, (SELECT * FROM TRANSACTIONS WHERE STATE = 'approved') A
WHERE T.ID = A.ID(+)
GROUP BY TO_CHAR(T.TRANS_DATE, 'YYYY-MM'), T.COUNTRY

 

4. 풀이 과정 중 알아야 할 것들!