Power BI | CALCULATE() vs. CALCULATETABLE()
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이 됩니다.