본문 바로가기
행복바이러스 행복바이러스

노션 수식을 활용한 재무/예산 데이터의 누적 합계(Running Total) 산출 로직 구현

읽는 시간 약 13분

가계부나 사업비 관리용 노션 데이터베이스를 만들다 보면 단순한 월별 합계보다 중요한 값이 있습니다. 바로 거래가 발생할 때마다 잔액이 어떻게 변했는지 보여주는 누적 합계(Running Total)입니다.

예를 들어 첫날 100만 원이 입금되고 다음 날 20만 원을 지출했다면, 단순 합계가 아니라 각 거래 행에 1,000,000원 → 800,000원처럼 잔액이 표시되어야 합니다.

하지만 노션 수식은 기본적으로 현재 행의 속성만 계산하기 때문에 엑셀의 누적 합계처럼 바로 위 행을 참조할 수 없습니다. 이를 해결하려면 관계형 속성과 Formula 2.0의 filter(), map(), sum() 함수를 함께 사용해야 합니다.


1. 누적 합계란 무엇인가?

누적 합계는 현재 거래까지 발생한 모든 금액을 차례대로 더한 값입니다.

날짜구분금액반영 금액누적 잔액
9월 1일수입1,000,000원1,000,000원1,000,000원
9월 3일지출200,000원-200,000원800,000원
9월 5일수입300,000원300,000원1,100,000원
9월 7일지출150,000원-150,000원950,000원

일반 합계는 전체 수입과 지출의 최종 결과만 보여줍니다. 반면 누적 합계는 특정 날짜에 얼마의 예산이 남아 있었는지를 거래별로 확인할 수 있다는 장점이 있습니다.


2. 재무 데이터베이스 속성 구성하기

먼저 노션에서 새 데이터베이스를 만들고 다음과 같이 속성을 구성합니다.

속성 이름속성 유형용도
거래명제목급여, 식비, 교통비 등
날짜날짜거래가 발생한 날짜
구분선택수입 또는 지출
금액숫자실제 거래 금액
반영 금액수식수입은 양수, 지출은 음수로 변환
전체 거래관계형같은 데이터베이스의 거래 연결
누적 잔액수식현재 날짜까지의 금액 합산

금액 속성의 숫자 형식은 원화 또는 숫자로 설정하면 됩니다. 음수를 직접 입력하는 방식도 가능하지만, 입력 실수를 줄이려면 구분을 선택하고 수식으로 부호를 변환하는 편이 안전합니다.


3. 수입과 지출을 양수·음수로 변환하기

반영 금액이라는 수식 속성을 만든 다음 아래 수식을 입력합니다.

if(
  prop("구분") == "지출",
  prop("금액") * -1,
  prop("금액")
)

이 수식은 거래 구분이 지출이면 금액에 -1을 곱하고, 수입이면 원래 금액을 유지합니다.

빈칸까지 처리하려면 다음 수식을 사용할 수 있습니다.

if(
  empty(prop("금액")),
  0,
  if(
    prop("구분") == "지출",
    prop("금액") * -1,
    prop("금액")
  )
)

이렇게 설정하면 금액이 비어 있는 행에서 오류가 발생하거나 잘못된 값이 표시되는 것을 줄일 수 있습니다.


4. 같은 데이터베이스를 연결하는 관계형 속성 만들기

노션에는 엑셀의 ‘이전 행’을 직접 참조하는 기능이 없습니다. 따라서 현재 거래에서 전체 거래 목록을 확인할 수 있도록 자기 자신을 연결하는 관계형 속성이 필요합니다.

설정 순서는 다음과 같습니다.

  1. 데이터베이스 오른쪽의 +를 눌러 새 속성을 만듭니다.
  2. 속성 유형에서 관계형을 선택합니다.
  3. 연결할 데이터베이스로 현재 사용 중인 재무 데이터베이스를 선택합니다.
  4. 속성 이름을 전체 거래로 지정합니다.
  5. 각 거래 행에 누적 계산 대상이 되는 거래들을 연결합니다.

관계형 속성은 다른 데이터베이스뿐 아니라 같은 데이터베이스도 연결할 수 있습니다. 노션의 롤업은 관계형 속성으로 연결된 페이지의 숫자를 합계, 평균, 최솟값 또는 최댓값 등으로 집계할 수 있습니다.

다만 관계형 속성에 새 거래가 자동으로 모두 들어오는 것은 아닙니다. 거래를 추가할 때 관계를 연결하거나, 데이터베이스 템플릿과 자동화 기능을 이용해 관리해야 합니다.


5. 날짜를 기준으로 누적 잔액 계산하기

누적 잔액이라는 수식 속성을 만들고 다음 수식을 입력합니다.

lets(
  기준일, prop("날짜"),
  prop("전체 거래")
    .filter(current.prop("날짜") <= 기준일)
    .map(current.prop("반영 금액"))
    .sum()
)

수식 작동 원리

  • 기준일에는 현재 행의 날짜가 저장됩니다.
  • filter()는 전체 거래 중 현재 날짜보다 이전이거나 같은 거래만 남깁니다.
  • map()은 필터링된 거래에서 반영 금액만 가져옵니다.
  • sum()은 가져온 금액을 모두 합산합니다.

Formula 2.0에서는 관계형 속성이 페이지 목록을 반환하므로, 별도의 롤업 속성을 만들지 않아도 map()과 filter()를 이용해 연결된 페이지의 속성을 계산할 수 있습니다.


6. 같은 날짜에 여러 거래가 있을 때 주의할 점

날짜만 비교하면 같은 날 발생한 모든 거래가 한꺼번에 누적됩니다.

예를 들어 9월 5일에 식비 3만 원과 교통비 2만 원을 입력하면 두 거래의 누적 잔액이 동일하게 표시될 수 있습니다. 하루 단위 예산 관리라면 문제가 없지만, 거래 순서대로 잔액을 표시하려면 거래 순번 속성을 추가해야 합니다.

필요한 속성

속성 이름유형입력 예시
날짜날짜2026-09-05
거래 순번숫자1, 2, 3
반영 금액수식-30,000원

다음은 날짜와 거래 순번을 함께 비교하는 수식입니다.

lets(
  기준일, prop("날짜"),
  기준순번, prop("거래 순번"),
  prop("전체 거래")
    .filter(
      current.prop("날짜") < 기준일 or
      (
        current.prop("날짜") == 기준일 and
        current.prop("거래 순번") <= 기준순번
      )
    )
    .map(current.prop("반영 금액"))
    .sum()
)

이제 날짜가 같더라도 거래 순번에 따라 잔액이 차례대로 계산됩니다.


7. 계좌별 누적 잔액 계산하기

현금, 생활비 통장, 사업용 계좌 등을 하나의 데이터베이스에서 관리한다면 날짜만 비교해서는 안 됩니다. 현재 거래와 같은 계좌에 속한 내역만 계산해야 합니다.

먼저 계좌라는 선택 속성을 추가한 후 아래 수식을 사용합니다.

lets(
  기준일, prop("날짜"),
  기준계좌, prop("계좌"),
  prop("전체 거래")
    .filter(
      current.prop("계좌") == 기준계좌 and
      current.prop("날짜") <= 기준일
    )
    .map(current.prop("반영 금액"))
    .sum()
)

이 수식은 현재 행과 계좌가 같고, 거래 날짜가 현재 날짜보다 이전이거나 같은 데이터만 합산합니다.

따라서 생활비 통장 거래에는 생활비 통장의 잔액만, 사업용 계좌 거래에는 사업용 계좌의 잔액만 표시됩니다.


8. 월별 예산 사용액 계산하기

월간 예산을 관리하려면 현재 거래와 연도·월이 같은 지출만 필터링할 수 있습니다.

lets(
  기준월, formatDate(prop("날짜"), "YYYY-MM"),
  prop("전체 거래")
    .filter(
      formatDate(current.prop("날짜"), "YYYY-MM") == 기준월 and
      current.prop("구분") == "지출"
    )
    .map(current.prop("금액"))
    .sum()
)

이 수식을 사용하면 2026년 9월 거래에서는 2026년 9월에 발생한 지출만 합산됩니다.

월 예산을 별도의 숫자 속성으로 입력했다면 남은 예산도 계산할 수 있습니다.

prop("월 예산") - prop("월 지출 합계")

예산 사용률은 다음과 같이 계산합니다.

if(
  prop("월 예산") == 0,
  0,
  round(prop("월 지출 합계") / prop("월 예산") * 100)
)

결과를 퍼센트 형식으로 표시하려면 속성의 숫자 표시 형식을 조정하거나 수식에서 계산 방식을 맞춰야 합니다.


9. 누적 잔액에 상태 문구 표시하기

잔액만 표시하는 대신 현재 예산 상태를 함께 보여주면 확인하기 편합니다.

lets(
  잔액, prop("누적 잔액"),
  ifs(
    잔액 < 0, "🔴 예산 초과",
    잔액 < 100000, "🟠 잔액 주의",
    잔액 >= 100000, "🟢 예산 안정"
  )
)

기준 금액은 자신의 월 예산 규모에 맞게 변경하면 됩니다.

잔액과 상태를 하나의 수식에서 함께 표시할 수도 있습니다.

lets(
  잔액, prop("누적 잔액"),
  상태, ifs(
    잔액 < 0, "🔴 예산 초과",
    잔액 < 100000, "🟠 잔액 주의",
    "🟢 예산 안정"
  ),
  상태 + "|" + format(잔액) + "원"
)

다만 이 방식은 결과가 숫자가 아닌 텍스트로 변환됩니다. 차트나 추가 계산에 사용할 예정이라면 숫자형 누적 잔액과 텍스트형 예산 상태를 분리하는 것이 좋습니다.


10. 누적 합계가 제대로 나오지 않는 원인

관계형 속성에 거래가 누락된 경우

수식은 전체 거래에 연결된 페이지만 계산합니다. 새로 등록한 거래가 관계형 목록에 없다면 누적 금액에서도 제외됩니다.

속성 이름이 수식과 다른 경우

날짜, 반영 금액, 전체 거래처럼 수식에 사용된 이름은 실제 속성 이름과 정확히 같아야 합니다. 띄어쓰기까지 다르면 오류가 발생할 수 있습니다.

금액이 텍스트로 저장된 경우

10,000원을 텍스트 속성에 입력하면 바로 합산할 수 없습니다. 금액은 반드시 숫자 속성으로 만드는 것이 좋습니다.

날짜가 비어 있는 경우

날짜가 없는 거래는 비교 조건이 정상적으로 작동하지 않을 수 있습니다. 다음처럼 빈 날짜를 먼저 확인할 수 있습니다.

if(
  empty(prop("날짜")),
  0,
  lets(
    기준일, prop("날짜"),
    prop("전체 거래")
      .filter(current.prop("날짜") <= 기준일)
      .map(current.prop("반영 금액"))
      .sum()
  )
)

수식 참조가 지나치게 복잡한 경우

수식이 다른 수식과 롤업을 여러 단계로 참조하면 계산이 느려지거나 깊이 제한 오류가 발생할 수 있습니다. 노션 공식 도움말에 따르면 수식 참조는 최대 15단계까지 중첩될 수 있으므로, 복잡한 계산은 중간 속성을 나눠 구성하는 편이 안전합니다.


11. 데이터가 많아졌을 때의 최적화 방법

거래가 수백 건 이상 쌓인 상태에서 모든 행이 전체 거래를 필터링하면 데이터베이스가 느려질 수 있습니다.

이때는 다음과 같이 개선할 수 있습니다.

  • 연도별 또는 월별로 재무 데이터베이스 분리하기
  • 현재 연도의 거래만 관계형 속성에 연결하기
  • 계좌별 데이터베이스 또는 월별 요약 데이터베이스 만들기
  • 최종 합계만 필요하다면 수식 대신 롤업의 합계 사용하기
  • 화면에 필요하지 않은 복잡한 수식 속성 숨기기
  • 월별 보기에는 해당 기간 필터 적용하기

노션의 롤업은 연결된 숫자 속성에 Sum 계산을 적용할 수 있습니다. 다만 롤업의 롤업처럼 중첩된 집계에는 제한이 있으므로 데이터베이스 구조를 지나치게 복잡하게 만들지 않는 것이 좋습니다.


마무리

노션에서 누적 합계를 구현할 때 핵심은 현재 행의 바로 위 값을 찾는 것이 아닙니다. 관계형 속성으로 거래 목록을 가져온 다음, 현재 날짜까지의 거래만 필터링해 합산하는 방식으로 접근해야 합니다.

기본 구조는 다음 세 단계로 정리할 수 있습니다.

  1. 수입과 지출을 양수·음수로 변환합니다.
  2. 자기 관계형 속성으로 계산 대상 거래를 연결합니다.
  3. filter() → map() → sum() 순서로 현재 날짜까지 합산합니다.

하루 단위 관리에는 날짜 비교만으로 충분하지만, 같은 날짜의 거래 순서까지 구분하려면 거래 순번을 추가해야 합니다. 계좌별 또는 월별 조건도 함께 적용하면 가계부뿐 아니라 사업비, 프로젝트 예산, 마케팅 비용 관리에도 활용할 수 있습니다.

youngji
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.