Power BI 합계 오류를 막는 데이터 모델: 다대다 관계와 검증 예제
AI Editter
제품별 매출은 맞는데 목표 금액을 합치자 숫자가 커지거나, 지역별 행의 합계와 전체 합계가 다르게 보이는 일이 있습니다. 이때 SUM을 SUMX로 바꾸기 전에 각 표의 한 행이 무엇을 뜻하는지부터 확인해야 합니다.
Power BI의 합계 문제는 크게 세 갈래입니다. 데이터를 병합하는 과정에서 행이 늘었거나, 관계를 통해 필터가 예상과 다르게 전달됐거나, 측정값이 전체 문맥에서 다시 계산된 경우입니다. 같은 증상처럼 보여도 고치는 위치는 다릅니다.

주문 상세와 월 목표를 직접 붙였을 때 생기는 문제
다음은 가상 자료입니다. 매출표의 단위는 주문 한 줄, 목표표의 단위는 월·제품 한 줄입니다.
| 주문 | 월 | 제품 | 매출 |
|---|---|---|---|
| O-1 | 2026-10 | A | 100 |
| O-2 | 2026-10 | A | 200 |
| O-3 | 2026-10 | B | 50 |
| 월 | 제품 | 목표 |
|---|---|---|
| 2026-10 | A | 500 |
| 2026-10 | B | 100 |
목표를 제품과 월 기준으로 매출표에 병합하면 A의 500이 두 주문에 붙습니다. 그 열을 더하면 목표가 1,100으로 부풀지만 실제 목표는 600입니다. 올바른 전체 달성률은 350÷600, 약 58.33%입니다.
병합 뒤 중복 제거를 무조건 적용하면 두 개의 정상 주문 중 하나가 사라질 수 있습니다. 원본의 단위를 보존한 모델이 필요합니다.
공통 차원에서 두 사실 테이블을 필터링
이 예제는 매출표와 목표표를 분리하고, 고유한 제품표와 월표를 각각 연결할 수 있습니다. 제품표는 A·B가 한 번씩, 월표는 2026-10이 한 번씩 존재합니다. 두 차원의 1 쪽에서 매출·목표의 여러 행 쪽으로 필터가 흐르게 합니다.
제품(제품당 1행) ──→ 매출(주문당 1행)
└────────→ 목표(월·제품당 1행)
월(월당 1행) ─────→ 매출
└────────→ 목표
Microsoft의 스타 스키마 가이드는 차원과 사실, 데이터의 세분화 수준을 구분하는 모델링 원칙을 설명합니다. 일별 분석도 필요하다면 날짜표와 월 단위 목표의 관계를 별도로 설계해야 합니다. 월 목표를 월 첫날에만 붙여 놓고 일별 달성률까지 자연스럽게 계산될 것이라고 기대하면 안 됩니다.
측정값은 각 원본의 단위를 유지한다
매출액 = SUM('매출'[매출])
목표액 = SUM('목표'[목표])
달성률 = DIVIDE([매출액], [목표액])
제품별 달성률을 단순 평균한 값은 전체 달성률과 다를 수 있습니다. 예제에서 A는 60%, B는 50%여서 단순 평균은 55%지만, 전체 금액 기준 달성률은 58.33%입니다. 전체 셀은 그 필터 문맥에서 측정값을 계산하므로, 행에 보이는 비율을 평균한 값이라고 가정하지 않습니다.
목표가 없는 제품도 구분합니다. 목표 0과 목표 미등록은 다릅니다. DIVIDE가 빈값을 반환한다고 둘을 같은 상태로 보고해서는 안 됩니다. 목표표의 해당 조합 존재 여부를 확인하는 점검 열이나 별도 시각화를 둡니다.
다대다 관계가 필요한 경우와 데이터 중복을 구별
고객 한 명이 여러 담당자에게 배정되고 한 담당자가 여러 고객을 관리한다면 실제로 다대다 관계가 존재합니다. 이 경우 고객·담당자 사이의 연결 테이블과 필터 방향을 설계해야 합니다. 단지 키가 중복된 오류를 피하려고 관계 종류를 다대다로 바꾸는 것은 별개 문제입니다.
공동 담당 고객의 매출을 각 담당자에게 모두 보여 줄지, 비율로 나눌지 먼저 정합니다. 모두에게 보여 준다면 담당자별 매출 합계가 회사 전체 매출보다 클 수 있습니다. 이는 규칙에 따라 정상일 수도 있지만 보고서에 정의를 밝혀야 합니다. 설계별 제약은 다대다 관계 공식 가이드를 참고합니다.
양방향 필터도 필요한 경로만 사용합니다. 시각화가 원하는 대로 보인다는 이유로 모든 관계를 양방향으로 바꾸면 다른 슬라이서나 합계에 예상치 못한 경로가 생길 수 있습니다.
관계 창에서 확인할 순서
① 모델 보기에서 두 표를 연결하는 선을 선택합니다. ② 카디널리티의 1 쪽 키가 실제로 고유한지 확인합니다. ③ 활성 관계와 교차 필터 방향을 확인합니다. ④ 슬라이서에는 가능하면 공통 차원의 필드를 사용합니다.
원본에서 키의 데이터 형식도 맞춰야 합니다. 제품코드 001과 숫자 1, 공백이 붙은 값은 동일하게 보이더라도 연결 결과가 다를 수 있습니다. 차원에 없는 사실 테이블의 키는 “기타”로 덮기 전에 원본 불일치 목록으로 추출합니다.
보고서 배포 전 6칸 시험
| 선택 조건 | 기대 매출 | 기대 목표 |
|---|---|---|
| 10월 전체 | 350 | 600 |
| 10월 제품 A | 300 | 500 |
| 10월 제품 B | 50 | 100 |
| 주문 O-1만 | 100 | 주문별 목표 배분 규칙 확인 |
| 목표 없는 신규 제품 | 원본 매출 | 미등록 상태 표시 |
| 존재하지 않는 월 | 데이터 없음 | 데이터 없음 |
주문 하나만 선택했을 때 월 목표를 어떻게 표시할지는 업무 정의입니다. 500을 그대로 보일지, 빈값으로 둘지, 배분할지 결정하고 측정값을 작성합니다. 모델이 자동으로 그 의미를 정해 주지는 않습니다.
실제 자료에서는 원본 SQL이나 별도 집계의 월·제품 합계를 기준값으로 보관합니다. Power BI 안에서 같은 측정값을 두 번 표시해 서로 맞는지 보는 것은 독립적인 검산이 아닙니다. 원본 건수와 금액, 누락키 수, 필터별 결과가 모두 맞아야 합계 문제를 해결했다고 판단할 수 있습니다.
관련 절차: SQL JOIN 중복으로 SUM 합계가 늘어날 때: 재현과 해결 · Power BI 새로 고침 실패: 게이트웨이·자격 증명·원본 점검