분류별 합계와 상품별 합계를 한 표에서 계산해도, 둘 다 틀릴 수 있습니다
프랜차이즈 ERP 에 물류 매입을 월별로 보는 분석 화면을 만들었습니다. 월 필터는 완료된 6개월에 진행 중인 달을 더했습니다.
화면에는 핵심 수치 4개, 월별 추이, 매출 대비 사용량, 분류별 매입, 상품 판매(POS), 개별 상품 내역을 두었습니다. 이 글은 화면 구성보다 그 과정에서 내린 작은 결정 세 가지를 다룹니다. 그중 중심은 같은 매입을 분류별·상품별로 나눠 보여 줄 때 계산을 몇 번 하느냐였습니다.
미리 밝혀 둘 것이 있습니다. 당시 작업 기록에는 무엇을 만들었는지는 남아 있지만, 왜 그렇게 정했는지는 대부분 없습니다. 그래서 이유를 풀어 쓴 자리에는 '추정'이라고 적었습니다.
같은 매입을 두 표로 보여 주면 합계가 어긋날 수 있습니다
분류별 합계와 상품별 합계는 같은 매입을 다른 기준으로 더한 값입니다. 표마다 쿼리를 따로 만들면 표에 맞춰 조건을 손볼 수 있어 편합니다. 대신 기간이나 제외 조건이 한쪽에서만 조금 달라져도 두 합계가 어긋날 수 있습니다.
화면을 보는 사람에게는 이쪽이 더 곤란합니다. 두 표의 합계가 다르면 어느 쪽이 맞는지 화면만으로는 알 수 없습니다. 결국 화면 전체를 다시 확인하게 됩니다.
아래 표는 이번 작업에서 정한 세 가지입니다. 가운데 칸은 당시 비교한 안이 아니라 뒤에서 따져 본 다른 길이고, 오른쪽 칸이 실제 구현입니다.
정할 것 | 갈 수 있었던 다른 길 | 실제 구현 |
|---|---|---|
분류·상품 값을 어떻게 계산하나 | 표마다 따로 집계한다 | 품목×월 표 하나에서 둘 다 계산한다 |
진행 중인 달을 어떻게 다루나 | 다른 달과 똑같이 넣는다 | 필터로는 볼 수 있게 두고 전월 대비와 추이에서 뺀다 |
상품 판매를 어떻게 나누나 | POS 소분류로 임시 구분한다 | 상품메뉴군으로 나누고, 판단할 수 없으면 '미지정'으로 둔다 |
품목×월 표 하나를 먼저 만들었습니다
분류 값과 상품 값을 각각 집계하지 않고 '품목×월 표'(품목 하나의 한 달 값을 한 행에 둔 표)를 먼저 만들었습니다. 분류별 값과 상품별 값은 둘 다 이 표에서 계산합니다.
품목×월 표 (행 하나 = 품목 + 월 + 값)
├─ 분류별 값 : 품목을 분류로 묶어 더한다
└─ 상품별 값 : 같은 행을 상품 기준으로 보여 준다계산의 출발점이 하나이니 조건도 한 곳에만 있습니다. 조건을 바꾸면 두 값이 함께 바뀝니다. 나중에 맞춰 보는 대신 처음부터 어긋날 수 없는 구조로 만든 것입니다.
같은 값을 두 번 계산하지 않는다는 원칙은 직전 기간 매출을 다룰 때도 같은 모양으로 나타났습니다.

이 방식은 집계 단위가 품목×월로 충분할 때 통합니다. 매장별이나 일별로 더 잘게 봐야 하면 표의 단위를 다시 정해야 합니다. 폐점 매장도 집계에 넣었는데, 이 판단의 이유는 기록에 없어 사실만 적습니다.
같은 표에서 나온 두 합계의 차이는 늘 0입니다
이렇게 만들면 두 합계를 서로 비교하는 검사는 의미가 줄어듭니다. 같은 표에서 계산한 두 합계의 차이는 언제나 0이기 때문입니다. 언제나 같은 값이 나오는 검사는 아무것도 알려 주지 않습니다.
이 말은 같은 표에서 계산할 때만 맞습니다. 서로 다른 데이터를 대조하는 화면이라면 차이를 보는 일이 오히려 핵심입니다.
이번 화면 안에도 그런 값이 있습니다. 상품 판매(POS)는 다른 데이터에서 오는 값이라 품목×월 표의 합계와 같아진다고 말할 수 없습니다. '어긋나지 않는다'는 말은 분류 값과 상품 값 사이에만 해당합니다.
두 합계가 같아도 실제 데이터와 맞는다는 뜻은 아닙니다
표를 하나로 모아도 없어지지 않는 위험이 있습니다. 같은 표에서 나온 값은 틀려도 함께 틀립니다. 표를 만드는 단계에서 어떤 거래가 빠지면 두 합계는 여전히 같고, 둘 다 틀린 값이 됩니다.
그래서 내부 합계 말고 바깥의 기준이 따로 필요합니다. 이번에는 기존 화면의 값이 그 기준이었습니다. 10월 한 달치의 총매출, 공급사 시스템별 값, POS 판매 수량과 금액을 기존 화면과 대조했고 모두 일치했습니다. 해당 서비스 테스트 4건도 통과했습니다.
범위도 같이 적어 둡니다. 이 대조는 10월 한 달치, 위에 적은 항목에 대한 것입니다. 다른 달이나 분류별 내역까지 확인했다는 뜻은 아닙니다. 합계 차이를 오차로 넘기지 않고 원천까지 따라간 다른 사례도 있습니다.

진행 중인 달은 필터에만 남겼습니다
진행 중인 달은 필터로 볼 수 있게 두고, 전월 대비와 추이에서는 뺐습니다. 이유는 기록에 없어 추정으로 적습니다. 덜 찬 달을 완료된 달과 비교하면 매달 줄어든 것처럼 보입니다. 값 자체는 맞는데 비교가 틀리는 경우입니다.
진행 중인 달을 아예 없앤 것은 아닙니다. 필터에서 고르면 그 달의 값을 볼 수 있고, 빠지는 곳은 비교 계산뿐입니다.
판단할 수 없는 상품은 '미지정'으로 드러냈습니다
상품 판매는 POS 소분류로 임시 구분하는 방법도 있습니다. 바로 쓸 수 있지만 임시 기준이 화면에 그대로 남습니다. 이번에는 '상품메뉴군'(상품을 메뉴 묶음으로 나눈 기준)으로 나누고, 다음 세 경우는 '미지정'으로 처리했습니다.
상품 연결이 없는 것
메뉴군이 없는 것
메뉴군이 여럿인 세트
세트에 메뉴군이 여럿이면 어느 쪽으로 볼지 코드가 고르지 않습니다. 임시 기준으로 어딘가에 넣으면 분류는 맞아 보여도 틀렸는지 알 수 없습니다. '미지정'으로 두면 사람이 고칠 목록이 됩니다.
다만 '미지정'이 많으면 그 화면의 분류는 읽기 어렵습니다. 이번 미지정 상품이 얼마나 되는지는 기록에 없습니다.

같은 구조의 화면을 만들 때 확인할 것
같은 값을 보여 주는 표가 둘 이상이면, 둘 다 같은 표에서 계산하고 있는가
두 합계를 비교하는 검사가 서로 다른 데이터를 대조하는가, 언제나 같은 값이 나오는 검사는 아닌가
내부 합계와 별개로 기존 화면 같은 바깥 기준과 대조했고, 대조한 기간과 항목을 적어 두었는가
진행 중인 달이 전월 대비와 추이 계산에 들어가 있지 않은가
판단할 수 없는 값을 임시 기준에 넣지 않고 '미지정'으로 보여 주는가
표를 하나로 모으면서 분류 값과 상품 값이 어긋날 자리는 없어졌습니다. 같은 표에서 나온 합계끼리는 서로를 검증하지 못하므로, 기존 화면과 대조하는 일은 그대로 남았습니다.
구조로 해결한 구간과 따로 확인할 구간을 나눠 적어 두면, 다음 작업에서 무엇을 다시 대조할지 바로 보입니다.