MySQL 리트코드 | Monthly Transactions I (DATE_FORMAT 함수_날짜 형식 지정)

728x90

 

문제

https://leetcode.com/problems/monthly-transactions-i/?envType=study-plan-v2&envId=top-sql-50

  • '년-월' 별, 나라 별 trans_count, approved_count, trans_amount, approved_total_amont 구하기

 

테이블

Transactions id country state amount trans_date
121 US approved 1000 2025-12-18
122 US declined 2000 2025-12-19
123 US approved 2000 2025-01-01
124 DE approved 2000 2025-01-07
  • 예를 들어, '2025-12'에 US는
    • trans_count :  2개
    • approved_count : 1개
    • trans_total_amount : 3000
    • approved_total_amount : 1000

 

풀이과정

▶ DATE_FORMAT(날짜, 형식)  사용 정답

# '년-월' 형식으로 month 조회하기

  • trans_date에서 '년-월' 형식으로 날짜 데이터 추출

DATE_FORMAT(날짜, 형식)

형식 의미 형식 의미
%Y 4자리 연도 %y 2자리 연도
%c 한 자리 수 유지 ver. 월 %m 2자리 월
%M 긴ver. 영문 월 %b 간소ver. 영문 월
%W 긴ver. 영문 요일 %a 간소ver. 영문 요일
%e 한자리 수 유지 일 %d 2자리 일
%H 24시ver. 시간 %l 12시ver. 시간
%i %S
%T hh:mm:ss %r  hh:mm:ss AM, PM

 

# 정답

  • month와 country 별로 요구하는 컬럼 값 계산
1
2
3
4
5
6
7
8
SELECT DATE_FORMAT(trans_date, '%Y-%m') month,
       country,
       COUNT(*) trans_count,
       SUM(IF(state='approved'10)) approved_count,
       SUM(amount) trans_total_amount,
       SUM(IF(state='approved', amount, 0)) approved_total_amount
FROM Transactions
GROUP BY month, country
cs

 

다른 사람 풀이 참고

: '년-월' 형식의 month를 만드는 다양한 방식

▶ SUBSTRING(문자열, 시작자릿수, 개수) 사용 정답

# 정답

1
2
3
4
5
6
7
8
SELECT SUBSTRING(trans_date,1,7) as month,
       country,
       COUNT(state) as trans_count,
       SUM(state='approved') as approved_count,
       SUM(amount) as trans_total_amount,
       SUM(IF(state='approved',amount,0)) as approved_total_amount
FROM Transactions
GROUP BY month, country;
cs

 

▶ LEFT(문자열, 개수) 사용 정답

# 정답

1
2
3
4
5
6
7
8
SELECT LEFT(trans_date, 7) AS month,
    country, 
    COUNT(id) AS trans_count,
    SUM(state = 'approved') AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM((state = 'approved'* amount) AS approved_total_amount
FROM Transactions
GROUP BY month, country;
cs

 

 

 

728x90

댓글