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

행별 계산과 누계와 총합을 한 번에: MAP/SCAN/REDUCE 개념으로 설계하는 계산 열

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

글 개요 — 수량과 단가가 있으면 금액을 만들고, 금액이 있으면 누계와 총합을 만들며, 이 세 가지가 갖춰지면 대부분의 집계 보고가 안정적으로 굴러갑니다. 여기서는 MAP/SCAN/REDUCE라는 사고방식을 스프레드시트 공식으로 옮겨, 보조 열 없이도 금액과 누계와 총합을 단숨에 계산하는 방법을 안내드립니다. 스크린샷 없이 따라 하실 수 있도록 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를 내려받아 위 공식을 그대로 적용하시면 동일 결과를 곧바로 재현하실 수 있습니다.