안녕하세요!
이번 포스팅은 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. 풀이 과정 중 알아야 할 것들!
'SQL > LeetCode' 카테고리의 다른 글
| [SQL] Queries Quality and Percentage(LeetCode/Oracle) (0) | 2023.10.20 |
|---|---|
| [SQL] Last Person to Fit in the Bus(LeetCode/Oracle) (0) | 2023.10.20 |
| [SQL] Reformat Department Table(LeetCode/Oracle) (0) | 2023.10.20 |
| [SQL] Immediate Food Delivery II(LeetCode/Oracle) (0) | 2023.10.20 |
| [SQL] Product Price at a Given Date(LeetCode/Oracle) (0) | 2023.10.19 |