[지표] 전월 대비 증감률

yozzum·2025년 2월 28일

SQL

목록 보기
35/36
WITH RECURSIVE month_series AS (
    -- 최소~최대 payment_date 범위에서 연월 리스트 생성
    SELECT MIN(DATE_FORMAT(payment_date, '%Y-%m-01')) AS yearmonth
    FROM payment
    UNION ALL
    SELECT DATE_ADD(yearmonth, INTERVAL 1 MONTH)
    FROM month_series
    WHERE yearmonth < (SELECT MAX(DATE_FORMAT(payment_date, '%Y-%m-01')) FROM payment)
), monthly_sales AS (
    -- 월별 총 결제 금액 계산 (구매 내역 없는 달은 0 처리)
    SELECT 
        ms.yearmonth,
        COALESCE(SUM(p.amount), 0) AS total_sales
    FROM month_series ms
    LEFT JOIN payment p 
        ON DATE_FORMAT(p.payment_date, '%Y-%m') = DATE_FORMAT(ms.yearmonth, '%Y-%m')
    GROUP BY ms.yearmonth
)
SELECT 
    ms1.yearmonth,
    ms1.total_sales,
    ms2.yearmonth AS prev_month,
    COALESCE(ms2.total_sales, 0) AS prev_total_sales,
    CASE 
        WHEN ms2.total_sales IS NULL THEN NULL  -- 첫 달은 증감률 계산 X
        WHEN ms2.total_sales = 0 THEN 100.00  -- 직전 월이 0이면 100% 증가
        ELSE ROUND((ms1.total_sales - ms2.total_sales) / ms2.total_sales * 100, 2)
    END AS growth_rate
FROM monthly_sales ms1
LEFT JOIN monthly_sales ms2 
    ON ms2.yearmonth = DATE_FORMAT(DATE_SUB(ms1.yearmonth, INTERVAL 1 MONTH), '%Y-%m-01')
ORDER BY ms1.yearmonth;
profile
yozzum

0개의 댓글