CALCULATE는 필터를 수정하는 강력한 DAX 기능입니다. CALCULATE()는 DAX에서 가자 중요하고 강력한 함수입니다. CALCULATE()는 시각적 개체에서 비롯된 필터 컨텍스트를 수정할 수 있는 유일한 함수입니다.
CALCULATE()의 구문은 다음과 같습니다.
=CALCULATE(식, 필터1, 필터2, 필터n...)
CALCULATE()는 두 가지 유형의 필터를 사용할 수 있습니다. 단순 필터는 왼쪽에 열 이름, 오른쪽에 값이 있는 형태입니다. 예를 들면 Customers[Gender] = "F"입니다. 고급 필터는 필터에 필요한 값을 포함하는 테이블 형식으로 전달됩니다. 테이블은 물리적 테이블 또는 테이블을 반환하는 함수(예 : ALL, VALUES, FILTER)등이 사용됩니다.
특별히 오늘은 테이블 확장, 컨텍스트 전환, 평가 순서, 수정 등에 대해서 중점을 두고 알아보겠습니다. 사용 유즈 케이스는 필터 컨텍스트를 간단하게 전환하는 경우, ALL/KEEPFILTERS/REMOVEFILTERS를 사용하여 필터 컨텍스트를 수정하는 경우, Total 대비 차지하는 비율, 카테고리별 차지하는 비율을 구하는 경우입니다.
테이블 확장 (Expand Table)
만약 Sales 테이블 (many) 이 있고 Product_Category_Lookup 테이블 (1) 이 있다고 하죠. 두 개의 테이블은 연결되어 있습니다.
Total Bike Orders =
CALCULATE(
[Total Orders],
FILTER(
Product_Category_Lookup,
Product_Category_Lookup[CategoryName] = "Bikes"
)
)
위와 같은 DAX 식이 작성되었을 때, 필터는 Product_Category_Lookup (1)에서 Sales 테이블(many)로 전파됩니다. 따라서 CategoryName이 Bike인 값들만 필터 되어 테이블이 확장되게 됩니다.
컨텍스트 전환 - 계산열 (CONTEXT TRANSITION - CALCULATED COLUMNS)
컨텍스트 전환은 행 컨텍스트를 필터 컨텍스트로 전환하는 것입니다.
SUM()을 사용하여 계산 열을 작성할 때 CALCULATE가 없다면 합계 계산한 동일한 값이 모든 각 행에 적용이 될 것입니다. 하지만 CALCULATE 구문 안에 SUM()이 들어간다면 CALCULATE로 인해 필터 컨텍스트가 적용되기 때문에 각 행 별로 계산된 값이 적용됩니다.
예시 구문은 다음과 같습니다.
SUM of Quality =
CALCULATE(
SUM(
'Table'[quantity_sold]
)
)
반면에 SUM()을 사용하여 측정값을 작성할 때, CALCULATE가 없어도 필터 컨텍스트가 적용되어 각 행 별로 계산된 값이 적용됩니다. 왜냐하면 DAX는 측정값에서는 필터 컨텍스트가 자동으로 적용되기 때문입니다.
평가 순서 (EVALUATION ORDER)
두 가지 DAX 예시를 통해 DAX 구문에서 평가 순서에 대해서 알아보겠습니다.
Store 3 Sales of Whole Bean Teas (CALCULATE) =
CALCULATE(
[Customer Sales], -> 3
'Store Lookup'[Sotre_id] = 3, -> 1
'Product Lookup'[Product_group] = "Whole Bean/Teas" -> 2
)
첫 번째는 'Store Lookup'[Sotre_id] = 3 인지 평가합니다. 두번째는 'Product Lookup'[Product_group] = "Whole Bean/Teas" 인지 평가합니다. 마지막으로 첫번째 두번째 필터가 적용된 테이블에 대해서 [Customer Sales]이 계산될 것입니다.
Store 3 Sales of Whole Bean Teas (Modifier) =
CALCULATE(
[Customer Sales], -> 4
'Store Lookup'[Sotre_id] = 3, -> 2
'Product Lookup'[Product_group] = "Whole Bean/Teas" -> 3
ALL( -> 1
'Store Lookup'
)
첫번째는 ALL('Store Lookup")을 평가합니다. 두 번째로'Store Lookup'[Sotre_id] = 3 인지 평가합니다. 세 번째는'Product Lookup'[Product_group] = "Whole Bean/Teas" 인지 평가합니다. 마지막으로 첫 번째 두 번째 세 번째 필터가 적용된 테이블에 대해서 [Customer Sales]이 계산될 것입니다.
순서는 있지만 DAX엔진은 여러 개의 필터를 한 개의 필터 컨텍스트로 AND 조합하여 평가를 진행하게 됩니다.
수정 (COMMON CALCULATE MODIFIERS)
CALCULATE는 필터 컨텍스트를 생성하거나 비 활성된 테이블 관계를 생성하거나 필터 전파 방식을 바꾸는 역할을 합니다.
- 필터 수정 (Modify Filters)
- ALL
- ALLSELECTED
- ALLNOBLANKROW
- ALLEXCEPT
- KEEPFILTERS
- REMOVEFILTERS
- 관계 수정 (Use Relationships)
- USERRELATIONSHIP
- 필터 전파 방식 수정 (Change Filter Propagation)
- CROSSFILTER
CALCULATE는 =CALCULATE(Expression, [Filter1], [Filter2],...) 의 구문을 가지는데 Filter는 boolean 또는 테이블 형태가 된다. 그러나 필터 인수는 자동으로 테이블로 바꾸게 됩니다.
REMOVEFILTERS
REMOVEFILTERS는 특정한 테이블이나 컬럼의 필터를 제거하는 DAX입니다. CALCULATE와의 조합으로 사용되죠. ALL과 같은 역할을 합니다.
=REMOVEFILTERS(TableName or ColumnName, [ColumnName], [...]) 의 구문 형태로 쓰입니다.
앞의 TableName or ColumnName은 제거하고 싶은 테이블이나 컬럼이 위치합니다. 뒤의 Column Name은 옵션사항으로 base table 내에서 개별 컬럼으로부터 특정 필터를 지울 때 사용합니다.
예를 들면 아래와 같이 DAX 구문을 작성할 수 있습니다.
<예시1>
CALCULATE(
[Customer Sales],
REMOVEFILTERS(
'Store Lookup'
)
)
<예시2>
CALCULATE(
[Customer Sales],
REMOVEFILTERS(
'Store Lookup'[store_id]
)
)
KEEPFILTERS
KEEPFILTERS는 CALCULATE 설정된 조건을 만족하는 필터를 유지하는 구문입니다.
=KEEPFILTERS(Expression) 의 구문 형태로 쓰입니다.
예를 들면 아래와 같이 DAX 구문을 작성할 수 있습니다. 'Store Lookup'[store_id]가 5를 만족하는 필터가 측정값에 대해서 유지가 됩니다. 만약 Store Lookup'[store_id]에 대해서 슬라이서를 추가하고 5를 선택하면 측정값이 나타나지만 다른 값을 선택하면 -로 나타납니다.
<예시1>
CALCULATE(
[profit],
KEEPFILTERS('Store Lookup'[store_id] = 5)
)
이번에는 KEEPFILTERS 없이 필터 구문만 CALCULATE에 적용하면 어떻게 될까요? 만약 Store Lookup'[store_id]에 대해서 슬라이서를 추가했을 때 어떤 값을 선택하던지 'Store Lookup'[store_id] = 5를 만족하는 값이 나타납니다.
<예시2>
CALCULATE(
[measure],
'Store Lookup'[store_id] = 5
)
지금까지 Power BI의 DAX함수 중 CALCULATE에 대해서 살펴보았습니다. CALCULATE는 매우 중요한 함수이므로 관심 있게 공부하고 활용해야 하겠습니다.
읽어주셔서 감사합니다. 오늘도 성장하는 하루 되세요!
'데이터 분석 및 업무 자동화' 카테고리의 다른 글
MySQL로 데이터분석 해보자 - ORDER BY, RANK (0) | 2022.01.24 |
---|---|
파워비아이 DAX 함수, TABLE과 FILTER를 알아보자 (0) | 2022.01.19 |
슈퍼차지 파워 BI - Power BI DAX 입문자 추천 책 (0) | 2022.01.06 |
adsp (데이터분석 준전문가) 나의 합격 수기 (0) | 2022.01.04 |
MySQL 기초 - 조건에 맞는 데이터 가져오기 (WHERE, LIKE, IS NULL) (0) | 2022.01.03 |
댓글