왜 롤링 윈도우인가 — 일주일 전부터 오늘까지, 한 달 전부터 오늘까지, 석 달 전부터 오늘까지처럼 최근 기간의 누적을 빠르게 보는 방식은 재고 회전, 매출 추세, 캠페인 효과 점검에 가장 자주 쓰입니다. 문제는 달력이 넘어갈 때마다 새 범위를 손으로 잡는 일이 반복된다는 점입니다. 이 글은 Excel과 Google Sheets에서 SUMIFS
와 EDATE
EOMONTH
를 이용해 주 월 분기 기준의 롤링 합계를 한 번의 수식으로 고정하는 방법을 설명합니다. 샘플 CSV와 결과 CSV까지 함께 제공하니 바로 내려받아 재현해 보십시오.
다운로드
- 샘플 일별 매출 CSV: E8_rolling_sample.csv
- 롤링 합계 결과 CSV: E8_rolling_result.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_cal
과 roll_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 |
설계 원리. 창을 날짜로 정의하고, 조건식을 고정한다
- 창의 시작과 끝을 먼저 정의 — 주간 롤링은 오늘 포함 최근 7일처럼 날짜 차이로 정의합니다. 월 분기 롤링은
EDATE
를 사용해 정확히 한 달 또는 석 달 전의 다음 날을 시작으로 잡습니다. - SUMIFS로 범위를 선언 — 조건은 두 개뿐입니다. 날짜 범위와 그룹 키(여기서는 channel). 이 두 조건을
SUMIFS
에 그대로 넣으면 됩니다. - 행 기준 계산으로 확장 — 표 구조 참조를 이용하면 각 행마다 자신의 날짜를 기준으로 같은 수식이 작동합니다.
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개월 창 중 무엇을 표준으로 쓸지, 월말 기준 집계를 병행할지 미리 정리해 두면 팀 간 값 차이를 줄일 수 있습니다.
- 정렬과 형식 — 날짜 오름차순 정렬과 통화 형식을 기본으로 지정하면 읽기 쉬운 표가 됩니다.
재현 가이드
- 샘플 CSV를 불러오고 표 이름을 Sales로 지정합니다.
- 위 Excel 또는 Sheets 수식 중 필요한 창을 선택해 새 열에 붙여 넣습니다.
- 피벗 없이도 롤링 합계로 추세를 파악할 수 있으며, 필요하면
SORTBY
로 최신일이 위로 오게 정렬해 보십시오. - 정책상 월말 기준 집계가 추가로 필요하다면
EOMONTH
로 각 달의 마지막 날을 표시하는 보조 열을 만들어 결합하면 됩니다.
정리
롤링 윈도우는 정의가 간단합니다. 시작일과 종료일만 정확히 잡으면 됩니다. EDATE
로 달 단위 창을, 단순 날짜 연산으로 일수 창을 만들고 SUMIFS
에 조건으로 선언하면, 데이터가 늘어도 수식은 그대로 돌아갑니다. 제공된 CSV를 내려받아 본문 수식을 붙여 보세요. 달력이 넘겨져도 보고 수치가 자동으로 따라오는, 손이 가지 않는 집계 체계를 바로 갖출 수 있습니다.