월별 매출 · 누적 · 전월 대비

난이도 보통 · 권장 8분 · 출력 컬럼 month, revenue, cumulative_revenue, mom_growth
이 문제 직접 풀어보기 →

문제

월별 결제 금액 합계와 누적 매출, 전월 대비 증감률(%)을 구하세요. · 증감률 = (이번달 - 전달) / 전달 × 100, 소수점 둘째 자리 반올림 · 첫 달의 증감률은 NULL 입니다. · 월 오름차순으로 정렬하세요.
정렬 month ASC

쉽게 설명하면

용돈 기록장. 이번 달 얼마 썼나 / 지금까지 합쳐서 얼마 / 지난달보다 얼마나 늘었나.

월이번 달누적전월 대비
1월100100(없음)
2월150250+50.00%
3월120370-20.00%

누적은 '위 칸들을 다 더한 값'. 전월 대비는 '한 칸 위 값과 비교'.

이렇게 푼다

  1. 월별 결제 금액 합계를 먼저 만든다.
  2. 누적은 처음부터 이번 줄까지 더하기 — SUM(매출) OVER (ORDER BY 월).
  3. 지난달 값은 한 칸 위에서 끌어온다 — LAG(매출) OVER (ORDER BY 월).
  4. (이번 − 지난) ÷ 지난 × 100.

이것만 피하면 된다

자세히

묻는 것 · 윈도우 함수 기본기. 누적과 LAG.

풀이 순서

  1. 월 단위로 먼저 집계해 한 달 = 한 행으로 만든다.
  2. 그 위에서 SUM() OVER (ORDER BY) 로 누적.
  3. LAG() 로 전월 값을 끌어와 증감률.

정답 (MySQL)

WITH m AS (
  SELECT DATE_FORMAT(paid_date, '%Y-%m-01') AS mm, SUM(amount) AS rev
  FROM payments GROUP BY mm
)
SELECT DATE_FORMAT(mm, '%Y-%m') AS month,
       rev AS revenue,
       SUM(rev) OVER (ORDER BY mm) AS cumulative_revenue,
       ROUND(100.0 * (rev - LAG(rev) OVER (ORDER BY mm))
             / LAG(rev) OVER (ORDER BY mm), 2) AS mom_growth
FROM m
ORDER BY mm;

함정

이렇게 변형된다

“전년 동월 대비”면 LAG(rev, 12).

← Q2. 채널별 퍼널 전환율Q4. 가입 코호트별 월간 리텐션 →