BI & Visualization/Power BI

Power BI | CALCULATE() vs. CALCULATETABLE()

올리브한입 2025. 3. 29. 12:19
반응형

CALCULATE CALCULATETABLE은 Power BI에서 DAX 함수의 핵심적인 함수들로, 데이터를 필터링하고 계산할 때 매우 유용합니다.

CALCULATE()

CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])

CALCULATE 함수는 식(Expression)의 값을 필터 컨텍스트를 변경하여 계산할 수 있게 도와줍니다.

Total sales on the last selected date =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] )
)

이 DAX 코드는 "선택된 기간(필터 컨텍스트)에서 가장 최신 날짜의 총 매출액(Total Sales)"을 계산하는 Measure입니다.

 

  • SUM(Sales[Sales Amount])
    • Sales[Sales Amount]의 합계를 계산하는 부분입니다.
    • 즉, 전체 판매 금액을 계산하는 기본적인 집계입니다.
  • MAX(Sales[OrderDateKey])
    • Sales[OrderDateKey]에서 가장 큰(최신) 날짜를 찾습니다.
    • 필터 컨텍스트가 적용되면, 현재 선택된 날짜 범위에서 가장 최신 날짜가 선택됩니다.
  • CALCULATE(...)
    • SUM(Sales[Sales Amount])을 계산하는데, 필터링 조건을 추가합니다.
    • 필터 조건: 'Sales'[OrderDateKey] = MAX('Sales'[OrderDateKey])
      • 즉, "가장 최신 날짜(MAX(OrderDateKey])에 해당하는 데이터만 포함해서 총 매출액을 계산하라"는 의미입니다.

 

예제 테이블은 위와 같습니다. 필터가 없는 경우, MAX('Sales'[OrderDateKey]는 2024-03-04가 되고, SUM(Sales[Sales Amount])은 2500을 반환합니다. 특정 기간 필터를 적용한 경우 (2024-03-01 ~ 2024-03-03 선택), MAX('Sales'[OrderDateKey]는 2024-03-03가 되므로 2000을 반환합니다.

 

Blue Revenue =
CALCULATE(
    SUM(Sales[Sales Amount]),
    'Product'[Color] = "Blue"
)

Sales: ProductKey 컬럼이 존재하며, 제품을 식별하는 키 (Foreign Key) 역할을 합니다. 동일한 ProductKey가 여러 번 나타날 수 있습니다. 같은 제품이 여러 번 팔리기 때문에.

SalesOrderLineKey ResellerKey CustomerKey ProductKey (FK) OrderDateKey DueDateKey ShipDateKey Product Standard Cost Total Product Cost Sales Amount
46953024 12 -1 213 20180806 20180816 20180813 $13.88 $55.51 $80.75
47447039 16 -1 213 20180928 20181008 20181005 $13.88 $55.51 $80.75
47980008 12 -1 213 20181105 20181115 20181112 $13.88 $69.39 $100.93
48386028 16 -1 213 20181227 20190106 20190103 $13.88 $41.63 $60.56
49100008 12 -1 213 20190212 20190222 20190219 $13.88 $41.63 $60.56
50722038 16 -1 213 20190621 20190701 20190628 $13.88 $55.51 $80.75
51703013 12 -1 214 20190802 20190812 20190809 $13.09 $170.12 $258.55
53562026 16 -1 214 20190922 20191002 20190929 $13.09 $39.26 $62.98
57023020 12 -1 214 20191102 20191112 20191109 $13.09 $117.78 $188.95
59063008 16 -1 214 20191230 20200109 20200106 $13.09 $39.26 $62.98
63141016 12 -1 214 20200204 20200214 20200211 $13.09 $52.35 $83.98
69401030 12 -1 214 20200503 20200513 20200510 $13.09 $104.69 $167.95
71938005 16 -1 214 20200615 20200625   $13.09 $39.26 $62.98

 

Product: ProductKey는 각 제품을 고유하게 식별하는 기본 키 (Primary Key)입니다. 각 제품(헬멧, 자전거 프레임 등)은 한 번만 나타납니다.

ProductKey (PK) SKU Product Standard Cost Color List Price Model Subcategory Category
210 FR-R92B-58 HL Road Frame - Black, 58  $                      868.63  Black  $     1,431.50  HL Road Frame Road Frames Components
211 FR-R92R-58 HL Road Frame - Red, 58  $                      868.63  Red  $     1,431.50  HL Road Frame Road Frames Components
212 HL-U509-R Sport-100 Helmet, Red  $                         12.03  Blue  $            33.64  Sport-100 Helmets Accessories
213 HL-U509-R Sport-100 Helmet, Red  $                         13.88  Blue  $            33.64  Sport-100 Helmets Accessories
214 HL-U509-R Sport-100 Helmet, Red  $                         13.09  Red  $            34.99  Sport-100 Helmets Accessories

 

Sales[ProductKey] (FK) → Product[ProductKey] (PK) 연결하고 1:N (One-to-Many) 관계를 설정할 수 있습니다.

 

위의 코드로 다시 돌아가 봅시다. 

Blue Revenue =
CALCULATE(
    SUM(Sales[Sales Amount]),
    Product[Color] = "Blue"
)

이 DAX 코드의 목적은 파란색(Blue) 제품의 총 매출(Sales Amount) 합계를 계산하는 것입니다.

  • Product[Color] = "Blue" → 파란색 제품(ProductKey = 212, 213)만 필터링
  • SUM(Sales[Sales Amount])  Sales 테이블에서 ProductKey = 213인 행들의 Sales Amount 합산

CALCULATETABLE()

CALCULATETABLE 함수는 CALCULATE와 유사하게 작동하지만, 결과로 테이블을 반환합니다. 즉, 주어진 식을 평가한 후 필터를 적용하여 새로운 테이블을 반환하는 함수입니다. 

CALCULATETABLE(<expression>[, <filter1> [, <filter2> [, …]]])
FilteredSales = 
CALCULATETABLE (
    Sales, 
    Sales[Sales Amount] > 5000, 
    'Product'[Category] = "Accessories"
)

위 예시에서는 Sales 테이블을 필터링하여 Sales Amount가 5000보다 큰 값과, Product 테이블의 Category가 "Accessories"인 데이터를 포함한 새로운 테이블을 생성합니다. 

= SUMX(
    CALCULATETABLE(
        'InternetSales_USD',
        'DateTime'[CalendarYear] = 2006
    ),
    [SalesAmount_USD]
)

SUMX는 테이블을 순차적으로 처리하면서 각 행에 대해 식을 평가하고, 그 결과를 합산합니다. 첫 번째 인자로 CALCULATETABLE로 반환된 2006년 데이터가 들어갑니다. 두 번째 인자는 SalesAmount_USD 열입니다. 각 행에 대해 SalesAmount_USD 값을 반환하고, 이를 모두 더합니다.

CALCULATETABLE DateTime 테이블에서 CalendarYear = 2006을 기준으로 InternetSales_USD 테이블을 필터링합니다. 따라서 2006년에 해당하는 데이터만 필터링됩니다.

SUMX는 필터링된 테이블에서 SalesAmount_USD 값을 합산합니다. 따라서 200 + 250 = 450이 됩니다.

반응형