글 개요 — 수량과 단가가 있으면 금액을 만들고, 금액이 있으면 누계와 총합을 만들며, 이 세 가지가 갖춰지면 대부분의 집계 보고가 안정적으로 굴러갑니다. 여기서는 MAP/SCAN/REDUCE라는 사고방식을 스프레드시트 공식으로 옮겨, 보조 열 없이도 금액과 누계와 총합을 단숨에 계산하는 방법을 안내드립니다. 스크린샷 없이 따라 하실 수 있도록 CSV와 필드 해설을 함께 제공합니다.
실습 파일 다운로드
- 기본 데이터 예시: 10_qty_price.csv
- 계산 열이 적용된 결과본: 10_qty_price_enriched.csv
샘플 데이터 설명. 필드 한눈에 보기
기본 10_qty_price.csv
컬럼 | 의미 | 예시 | 비고 |
---|---|---|---|
qty |
수량 | 2 |
정수 |
price |
단가 | 12000 |
정수 원 단위 권장 |
결과 포함본 10_qty_price_enriched.csv
컬럼 | 의미 | 예시 | 비고 |
---|---|---|---|
qty |
수량 | 2 |
원본 유지 |
price |
단가 | 12000 |
원본 유지 |
amount |
행별 금액 | 24000 |
qty*price |
cumulative_amount |
상단부터 누적 금액 | 24000 |
첫 행은 금액과 동일 |
total_amount |
전체 합계 | 합계값이 모든 행에 반복 |
리포트 병합 없이 바로 참조 가능 |
핵심 아이디어 정리
MAP은 각 행에 같은 함수를 적용하는 생각입니다. amount는 MAP의 전형입니다. SCAN은 누적 접기입니다. cumulative_amount가 여기에 해당합니다. REDUCE는 범위를 한 값으로 접는 것입니다. total_amount가 이 개념을 그대로 따릅니다.
Excel 365 최신 함수로 구현하기
아래 예시는 표 형식으로 작업한다고 가정합니다. 열 이름 표기는 대괄호를 사용했습니다.
-- 1) 행별 금액 amount MAP 개념
=MAP([qty], [price], LAMBDA(q, p, q*p))
-- 2) 누적 금액 cumulative_amount SCAN 개념
=SCAN(0, [amount], LAMBDA(a, x, a + x))
-- 3) 총합이 모든 행에 반복되는 total_amount REDUCE + MAP 조합
=MAP([amount], LAMBDA(x, REDUCE(0, [amount], LAMBDA(a, y, a + y))))
total_amount는 한 셀의 합계를 복제하는 대신 MAP으로 각 행에 같은 값을 흘려보내는 방식이라 범위가 늘어도 자동으로 확장됩니다.
Google Sheets에서의 등가 구현
Sheets에서도 같은 개념을 다음과 같이 옮길 수 있습니다. 헤더가 1행이고 데이터가 2행부터라고 가정합니다.
-- 1) amount
=ARRAYFORMULA(IF(LEN(A2:A), A2:A * B2:B, ))
-- 2) cumulative_amount
=ARRAYFORMULA(IF(LEN(C2:C),
MMULT( N(ROW(C2:C) >= TRANSPOSE(ROW(C2:C))), C2:C ),
, ))
-- 3) total_amount 모든 데이터 행에서 합계를 반복
=ARRAYFORMULA(IF(LEN(C2:C), SUM(C2:C), ))
MMULT 누계 패턴은 범위를 너무 넓게 잡으면 계산 부담이 커질 수 있습니다. 실제 데이터 구간으로 제한해 주세요.
실무에서 바로 쓰는 방어 규칙
- qty와 price는 숫자만 허용합니다. 텍스트 혼입을 대비해 VALUE와 IFERROR를 함께 사용해 주세요.
- 빈 행은 계산에서 제외합니다. IF와 LEN 체크를 습관처럼 결합하시면 안전합니다.
- 표 범위를 사용하면 행 추가에도 공식을 고치지 않아도 됩니다.
빠른 검증 스니펫
-- 금액 합과 총합 열 일치
=SUM(amount) = LAST(total_amount)
-- 누계 마지막 값은 금액 합과 같아야 함
=LAST(cumulative_amount) = SUM(amount)
-- 음수나 빈값 탐지
=COUNTIF(qty, "<0") + COUNTIF(price, "<0") + COUNTBLANK(qty) + COUNTBLANK(price) = 0
응용 팁 몇 가지
- 할인율이나 세율이 있다면 MAP에 인자를 하나 더 추가해
LAMBDA(q, p, r, q*p*(1-r))
처럼 계산을 확장할 수 있습니다. - 구간별 누계가 필요하면 SCAN의 누적 로직에 조건을 끼워 넣어 구간이 바뀔 때 누계를 초기화하는 방식으로 구현할 수 있습니다.
- total_amount 대신 특정 그룹 합계를 반복하려면 FILTER 또는 BYROW와 조합하여 그룹 키별 REDUCE를 실행한 뒤 MAP으로 확산하면 됩니다.
마무리
행별 계산과 누계와 총합은 보고서의 기초 체력입니다. MAP SCAN REDUCE의 생각을 표 공식으로 옮겨 두시면 보조 열 없이도 계산이 투명하고 유지보수가 쉬워집니다. 제공된 CSV를 내려받아 위 공식을 그대로 적용하시면 동일 결과를 곧바로 재현하실 수 있습니다.