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

    댓글