본문 바로가기
데이터 분석 및 업무 자동화

Power BI DAX 배우기 - CALCULATE

by 공부머리 2022. 1. 17.
반응형

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는 매우 중요한 함수이므로 관심 있게 공부하고 활용해야 하겠습니다.

 

읽어주셔서 감사합니다. 오늘도 성장하는 하루 되세요!

반응형

댓글