Power Pivot · 데이터 모델 · DAX 기초 — 관계·측정값·CALCULATE·FILTER·SUMX 완전 가이드

Power Pivot & DAX — 꽁이가 Model·Relationships·Measures·CALCULATE·SUMX 블록을 쌓아 올리는 에디터 콘셉트
Power Pivot · 데이터 모델 · DAX 기초 — 관계·측정값·CALCULATE·FILTER·SUMX 완전 가이드

Power Pivot · 데이터 모델 · DAX 기초 — 관계·측정값·CALCULATE·FILTER·SUMX 완전 가이드

이 글은 Excel 365 환경에서 직접 재현·검수한 절차를 기준으로 정리했으며, 초안 정리에 AI 도구를 보조적으로 활용했습니다.

1. 스타 스키마 설계

사실(Fact): Sales(날짜, 품목ID, 고객ID, 수량, 금액). 차원(Dim): Products, Customers, Date 등. 키는 정수·고유값 권장.

  • 숫자/날짜 형식 정규화는 Power Query에서 끝내기.
  • 너무 넓은 사실 테이블은 CHOOSECOLS 아이디어로 슬림화.
샘플 데이터(CSV) — 복사해 사용
SalesDate,ProductID,CustomerID,Qty,Amount
2025-07-01,P001,C001,2,30000
2025-07-02,P002,C002,1,12000
2025-07-02,P001,C003,1,15000
2025-07-03,P003,C001,3,45000

2. 데이터 모델로 로드

  1. Power Query로 정리 → 홈 > 닫기 및 로드(대상: 데이터 모델).
  2. Power Pivot 창에서 테이블 보이기 확인.

3. 관계 설정과 필터 방향

일대다(1:*), 차원(1) → 사실(*) 단방향 필터가 기본. 다대다 필요 시 브릿지(매핑) 테이블을 고려.

4. 측정값 vs 계산 열

측정값은 보고서에 따라 즉시 계산(필터 컨텍스트). 계산 열은 행당 미리 계산(행 컨텍스트). 집계는 대부분 측정값으로.

// 측정값 예시(모델에서 작성)
Total Sales := SUM(Sales[Amount])
Orders := DISTINCTCOUNT(Sales[SalesDate] & "|" & Sales[CustomerID] & "|" & Sales[ProductID])

5. 핵심 DAX — CALCULATE · FILTER · SUMX

// 특정 조건만 적용
Seoul Sales := CALCULATE([Total Sales], Customers[Region]="Seoul")

// 필터 제거 후 전체 대비 비율
Category Share :=
DIVIDE([Total Sales],
       CALCULATE([Total Sales], ALL(Products[Category])))

// 행마다 금액 계산 후 합계
Revenue (Qty*Price) := SUMX(Sales, Sales[Qty] * RELATED(Products[Price]))

TIP DIVIDE로 0 나눗셈 보호. ALL/ALLEXCEPT/KEEPFILTERS로 필터 조작을 미세 조정.

6. 날짜 테이블 & YTD/MTD

// Date 테이블에 연/월/분기 컬럼 추가 후, 관계 연결
Sales YTD := TOTALYTD([Total Sales], 'Date'[Date])
Sales MTD := TOTALMTD([Total Sales], 'Date'[Date])

날짜 테이블은 연속 날짜여야 하며, 모델에서 날짜 테이블로 표시를 설정.

7. 실무 측정값 레시피 12가지

Avg Order Value := DIVIDE([Total Sales],[Orders])
Last Month Sales := CALCULATE([Total Sales], DATEADD('Date'[Date], -1, MONTH))
% to Last Month := DIVIDE([Total Sales]-[Last Month Sales],[Last Month Sales])
Top 10 Product Sales := CALCULATE([Total Sales], TOPN(10, VALUES(Products[Name]), [Total Sales], DESC))
New Customers :=
VAR prev = CALCULATE(DISTINCTCOUNT(Sales[CustomerID]), DATESINPERIOD('Date'[Date], MIN('Date'[Date]), -1, YEAR))
RETURN DISTINCTCOUNT(Customers[CustomerID]) - prev
Returning Customers :=
CALCULATE(DISTINCTCOUNT(Sales[CustomerID]), FILTER(Customers, [New Customers]=0))

8. 챌린지 퀴즈(정답 숨김)

  1. DAX에서 행 컨텍스트필터 컨텍스트의 차이를 한 줄로 설명해 보세요.
  2. CALCULATE([Total Sales], ALL('Date'))는 어떤 상황에 쓰나요?
  3. SUMXSUM 대신 쓰는 대표 사례는?
  4. YTD 계산이 0으로만 나온다면 가장 먼저 확인할 것은?
  5. 카테고리 점유율 측정값에서 분모가 올바르지 않다면 어떤 함수로 필터를 제거/보정하나요?
정답 보기
  1. 행 컨텍스트=현재 행 기준 계산, 필터 컨텍스트=슬라이서/행·열 머리글 등 보고서 필터 상태.
  2. 기간 필터 무시 후 전체 누적 대비 비율 계산 등.
  3. 행마다 수식(수량×단가 등) 평가 후 합산해야 할 때.
  4. 연속 날짜의 날짜 테이블 존재 여부와 관계 설정.
  5. ALL/ALLEXCEPT/KEEPFILTERS로 컨텍스트를 조정.
오늘은 Total Sales·YTD·카테고리 점유율 세 가지 측정값만 모델에 추가해 보세요. 다음엔 이 모델을 피벗+슬라이서로 연결해 팀 대시보드까지 확장할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *