본문 바로가기
카테고리 없음

주/월/분기 기준 롤링 윈도우 집계 만들기. 날짜만 바꿔도 스스로 돌아가는 합계

by 시트자동화 2025. 8. 17.

왜 롤링 윈도우인가 — 일주일 전부터 오늘까지, 한 달 전부터 오늘까지, 석 달 전부터 오늘까지처럼 최근 기간의 누적을 빠르게 보는 방식은 재고 회전, 매출 추세, 캠페인 효과 점검에 가장 자주 쓰입니다. 문제는 달력이 넘어갈 때마다 새 범위를 손으로 잡는 일이 반복된다는 점입니다. 이 글은 Excel과 Google Sheets에서 SUMIFSEDATE EOMONTH를 이용해 주 월 분기 기준의 롤링 합계를 한 번의 수식으로 고정하는 방법을 설명합니다. 샘플 CSV와 결과 CSV까지 함께 제공하니 바로 내려받아 재현해 보십시오.

다운로드

샘플 데이터 설명

샘플은 2025년 3월 1일부터 7월 31일까지 일별 금액이 채널별로 한 행씩 존재하는 구조입니다. 일자를 하루도 빠뜨리지 않는 것이 핵심입니다. 그래야 일수 기준 롤링 창이 정확히 작동합니다.

E8_rolling_sample.csv

컬럼 의미 예시 비고
date 일자 2025-07-20 YYYY-MM-DD 형식
channel 채널 Online Online 또는 Store
amount 일 매출 112053 정수

E8_rolling_result.csv

결과 파일은 동일한 행 구조에 롤링 합계가 추가된 표입니다. roll_7d는 최근 7일 누적, roll_30d는 최근 30일 누적, roll_90d는 최근 90일 누적입니다. roll_1m_calroll_3m_cal는 달 단위 창(한 달 전 다음 날부터 오늘, 석 달 전 다음 날부터 오늘)으로 계산한 버전입니다.

컬럼 의미 예시 계산 개념
roll_7d 최근 7일 누적 746231 date가 [@date-6..@date] 범위
roll_30d 최근 30일 누적 3102459 date가 [@date-29..@date]
roll_90d 최근 90일 누적 9000000+ date가 [@date-89..@date]
roll_1m_cal 최근 1개월 창 2987453 start=EDATE(@date,-1)+1 부터 @date
roll_3m_cal 최근 3개월 창 8921341 start=EDATE(@date,-3)+1 부터 @date

설계 원리. 창을 날짜로 정의하고, 조건식을 고정한다

  1. 창의 시작과 끝을 먼저 정의 — 주간 롤링은 오늘 포함 최근 7일처럼 날짜 차이로 정의합니다. 월 분기 롤링은 EDATE를 사용해 정확히 한 달 또는 석 달 전의 다음 날을 시작으로 잡습니다.
  2. SUMIFS로 범위를 선언 — 조건은 두 개뿐입니다. 날짜 범위와 그룹 키(여기서는 channel). 이 두 조건을 SUMIFS에 그대로 넣으면 됩니다.
  3. 행 기준 계산으로 확장 — 표 구조 참조를 이용하면 각 행마다 자신의 날짜를 기준으로 같은 수식이 작동합니다.

Excel 365 수식 레퍼런스

샘플을 표로 Sales라 이름 붙였다고 가정합니다. 열 이름은 date channel amount입니다. 다음 수식은 Sales 표의 새 열에 그대로 붙여 넣어 사용할 수 있습니다.

최근 N일 롤링 창

-- 최근 7일
=SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], ">="&[@date]-6, Sales[date], "<="&[@date])

-- 최근 30일
=SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], ">="&[@date]-29, Sales[date], "<="&[@date])

-- 최근 90일
=SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], ">="&[@date]-89, Sales[date], "<="&[@date])

최근 1개월 3개월 롤링 창(달 단위)

-- 최근 1개월: 한 달 전 다음 날부터 오늘
=LET(start, EDATE([@date], -1)+1,
     SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], ">="&start, Sales[date], "<="&[@date]))

-- 최근 3개월
=LET(start, EDATE([@date], -3)+1,
     SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], ">="&start, Sales[date], "<="&[@date]))

주의 — 달 단위 창은 실제 지난 달 길이에 따라 일수가 달라집니다. 반면 30일 90일 창은 고정 일수이므로 두 방식은 결과가 다를 수 있습니다. 보고 정책에 맞춰 한 가지를 선택해 쓰십시오.

Google Sheets 수식 레퍼런스

열 A가 date B가 channel C가 amount라고 가정하고, 2행이 현재 행입니다.

-- 최근 7일
=SUMIFS($C:$C, $B:$B, B2, $A:$A, ">="&A2-6, $A:$A, "<="&A2)

-- 최근 1개월
=LET(start, EDATE(A2,-1)+1,
     SUMIFS($C:$C, $B:$B, B2, $A:$A, ">="&start, $A:$A, "<="&A2))

-- 최근 3개월
=LET(start, EDATE(A2,-3)+1,
     SUMIFS($C:$C, $B:$B, B2, $A:$A, ">="&start, $A:$A, "<="&A2))

검증 체크리스트

-- 가장 첫 7일 구간에서 roll_7d는 단순 누계와 같아야 함
=SUMIFS(Sales[amount], Sales[channel], [@channel], Sales[date], "<="&MINIFS(Sales[date], Sales[channel], [@channel])+6)
= XLOOKUP(MINIFS(Sales[date], Sales[channel], [@channel])+6, Sales[date], Sales[roll_7d], , 0)

-- 30일 창은 7일 창보다 항상 크거나 같음
=Sales[roll_30d] >= Sales[roll_7d]

-- 3개월 달 단위 창이 90일 창보다 항상 크거나 같다는 보장은 없음. 정책 선택 확인용
-- 날짜가 바뀌면 창의 시작일도 바뀌는지 확인
=EDATE([@date], -1)+1 <= [@date]

성능과 유지 보수 팁

  • 일자 테이블을 연속으로 유지 — 중간에 비어 있는 날짜가 있으면 일수 기준 롤링이 흐트러질 수 있습니다. 없는 날은 amount 0으로 채워 둡니다.
  • 그룹 키는 늘 조건에 포함 — 채널뿐 아니라 지역 카테고리 같은 키가 있으면 SUMIFS 조건에 모두 넣어야 합니다.
  • 보고 정책을 문서화 — 30일 창과 1개월 창 중 무엇을 표준으로 쓸지, 월말 기준 집계를 병행할지 미리 정리해 두면 팀 간 값 차이를 줄일 수 있습니다.
  • 정렬과 형식 — 날짜 오름차순 정렬과 통화 형식을 기본으로 지정하면 읽기 쉬운 표가 됩니다.

재현 가이드

  1. 샘플 CSV를 불러오고 표 이름을 Sales로 지정합니다.
  2. 위 Excel 또는 Sheets 수식 중 필요한 창을 선택해 새 열에 붙여 넣습니다.
  3. 피벗 없이도 롤링 합계로 추세를 파악할 수 있으며, 필요하면 SORTBY로 최신일이 위로 오게 정렬해 보십시오.
  4. 정책상 월말 기준 집계가 추가로 필요하다면 EOMONTH로 각 달의 마지막 날을 표시하는 보조 열을 만들어 결합하면 됩니다.

정리

롤링 윈도우는 정의가 간단합니다. 시작일과 종료일만 정확히 잡으면 됩니다. EDATE로 달 단위 창을, 단순 날짜 연산으로 일수 창을 만들고 SUMIFS에 조건으로 선언하면, 데이터가 늘어도 수식은 그대로 돌아갑니다. 제공된 CSV를 내려받아 본문 수식을 붙여 보세요. 달력이 넘겨져도 보고 수치가 자동으로 따라오는, 손이 가지 않는 집계 체계를 바로 갖출 수 있습니다.