본문 바로가기
Power BI

Power BI DAX 기초 - FILTER 함수 행 컨텍스트 이해

by 꼬리무늬 2024. 7. 13.
728x90
반응형

 

목차

     

     

    개요

     

    CALCULATE 함수 입력 파라미터에 필터 정보를 전달할 때, FILTER 함수로 만든 테이블 필터 식을 사용할 수 있습니다. 

    즉, FILTER 함수를 통해 조건을 만족하는 테이블을 새로 만들어, CALCULATE 함수에서 측정값을 계산하는 데 사용할 수 있도록 합니다. 

    FILTER 함수는 매 행마다 조건을 만족하는지 평가하기 때문에, 반복기 함수의 특징을 갖고 있습니다. 따라서 행 컨텍스트 개념 및 어떻게 동작하는지 이해가 필요합니다. 

    생각보다 많이 헷갈리기 때문에, 원하는 정확한 측정값을 얻기 위해 연습이 많이 필요합니다. 

     

    예제에 사용된 데이터

     

    연습을 위한 간단한 테이블입니다. 주문 날짜 별 제품의 색깔, 수량, 가격을 포함하고 있습니다.

     

    측정값 [Sum of Amount]

     

    Sum of Amount =
    SUM ( SHOP[Amount] )

     

     

    FILTER 함수

     

    FILTER 함수 정의

     

    FILTER 함수 레퍼런스 문서를 참고하면, 아래와 같이 정의되어 있습니다.

     

     

    용어 정의
    table 필터링할 테이블입니다. 테이블은 테이블을 생성하는 식일 수도 있습니다.
    필터링 테이블의 각 행에 대해 계산할 부울 식입니다. 예를 들어 [Amount] > 0 또는 [Region] = "France"와 같습니다.

     

     


    FILTER 함수는 필터링 된 테이블을 반환합니다.

    따라서 FILTER 함수는 독자적으로 사용되지 않고, 다른 함수의 파라미터로 사용됩니다.

     

    FILTER 함수가 반환하는 테이블이 어떤 것인지 파악하기 위해 새로 테이블을 생성하거나 COUNTROWS 함수를 사용하여 측정값을 만들면 FILTER 함수의 동작을 이해하는데 도움이 됩니다.

     

     

    기본 동작 이해 - 행 컨텍스트

     

    FILTER 함수가 어떤 테이블을 만드는지 확인하기 위해 아래와 같이 새로운 테이블을 정의합니다.

    SHOP 테이블에서 Amount 열의 값이 20보다 크거나 같은 행을 모두 골라 테이블을 만들게 됩니다.

     

    Table Amount 20 =
        FILTER (
            SHOP,
            SHOP[Amount] >= 20
        )

     

     

    FILTER 함수는 모든 행을 하나씩 모드 검토합니다. 매 행마다 아래 식을 수행하며, 만족할 경우 새로운 테이블에 포함하고, 그렇지 않을 경우 제거합니다.

    • SHOP [Amount] >= 20

     

    이러한 과정을 모두 마치고 위 그림처럼 4개의 행을 갖는 테이블이 생성됩니다.

     

    FILTER로 만든 테이블이 어떻게 측정값과 연관될 수 있는지 알아보기 위해, 측정값 [Amount 20 Count]를 아래와 같이 정의합니다.

     

    Amount 20 Count =
    COUNTROWS (
        FILTER (
            SHOP,
            SHOP[Amount] >= 20
        )
    )

     

    아래와 같은 결과를 얻게 됩니다.

     

     

    행 컨텍스트 DAX 함수는 같은 방식으로 동작합니다. 

     

     

    반응형

     

     

    행 컨텍스트 동작 - 주의할 점

     

    행 컨텍스트를 단순히 행마다 반복한다고 생각하면 안 됩니다. 아래 내용을 꼭 확인하세요.

     

    행 컨텍스트에 대한 이해를 높이기 위해 아래와 같이 테이블과 측정값을 준비합니다.

     

    FILTER 함수의 식으로 측정값 [Sum of Amount]을 이용합니다.

     

    Sum of Amount 20 Count =
    COUNTROWS (
        FILTER (
            SHOP,
            [Sum of Amount] >= 20
        )
    )

     

     

    그리고 SHOP 테이블에서 Product와 Amount만을 남기고 새로운 테이블 SHOP_F를 만듭니다.

     

     

    F Sum of Amount =
    SUM ( SHOP_F[Amount] )

     

    F Amount 20 Count =
    COUNTROWS (
        FILTER (
            SHOP_F,
            SHOP_F[Amount] >= 20
        )
    )

     

    F Sum of Amount 20 Count =
    COUNTROWS (
        FILTER (
            SHOP_F,
            [F Sum of Amount] >= 20
        )
    )

     

    측정값으로 필터링할 때

     

    [Sum of Amount 20 Count] 결과

    SHOP 테이블에서 FILTER를 적용할 때, 측정값 [Amount 20 Count]와 [Sum of Amount 20 Count]를 비교합니다.

     

    두 개의 필터 식은 같은 결과를 만들어냅니다.

    • SHOP [Amount] >= 20
    • [Sum of Amount] >= 20

     

    [F Sum of Amount 20 Count] 결과

    SHOP_F 테이블에서 FILTER를 적용할 때, 측정값 [F Amount 20 Count]와 [F Sum of Amount 20 Count]를 비교합니다.

     

    • SHOP_F [Amount] >= 20
    • [F Sum of Amount] >= 20

     

    서로 다른 결과가 나옵니다. 동작에 무슨 차이가 있을까요?

     

    [F Sum of Amount] 동작은 아래처럼 일어납니다. 이것은 측정값이기 때문에 행 컨텍스트가 필터 컨텍스트로 변환됩니다. 

     

    따라서 첫 행의 "Product = A, Amount = 5"를 계산할 때, 테이블 전체에서 해당 행으로 필터를 수행합니다. 이에 따라 두 번째 행과 같은 것이니, 5 + 5 = 10이 됩니다.

     

    이러한 동작은 테이블의 모든 행을 반복하면서 일어납니다.

     

    행 컨텍스트가 필터 컨텍스트로 전환되어 계산됩니다.

     

     

    마치며

     

    FILTER 함수 입력 파라미터로 테이블이 넣는데, 테이블을 반환하는 대표적인 함수로 ALL, ALLSELECTED가 있습니다.

    만일 아래와 같이 ALL (SHOP)이 사용되면 어떤 결과를 갖게 될까요?

     

    ALL Sum of Amount 20 Count =
    COUNTROWS (
        FILTER (
            ALL (SHOP),
            [Sum of Amount] >= 20
        )
    )

     

    아래 결과처럼 외부 필터와 시각적 개체의 필터 컨텍스트를 모두 제거하는 효과를 갖게 됩니다.

     

     

     

    테이블을 반환하는 DAX 함수들은 FILTER 함수의 입력 파라미터로, FILTER 함수는 다른 DAX 함수의 입력 파라미터 많이 사용됩니다.

     

    기초적인 DAX 함수를 설명하는 포스트를 통해 측정값, 필터 컨텍스트, 행 컨텍스트가 어떤 의미를 갖는지 살펴봤습니다.

     

    CALCULATE 함수까지 어느 정도 사용할 수 있으면, 이제부터 응용의 단계가 시작될 수 있습니다.

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형