다음을 통해 공유


변수를 사용하여 DAX 수식 개선

데이터 모델러로서 일부 DAX 계산을 작성하고 디버깅하는 것은 어려울 수 있습니다. 복잡한 계산 요구 사항에는 종종 복합 식이나 복잡한 식을 작성하는 것이 포함됩니다. 복합 식에는 많은 중첩 함수를 사용하고 식 논리를 다시 사용할 수 있습니다.

DAX 수식에서 변수를 사용하면 더 복잡하고 효율적인 계산을 작성하는 데 도움이 될 수 있습니다. 변수는 성능, 안정성, 가독성을 향상시키고 복잡성을 줄일 수 있습니다.

이 문서에서는 전년 대비(YoY) 매출 증가에 대한 예제 측정값을 사용하여 처음 세 가지 이점을 설명합니다. (YoY 매출 증가에 대한 공식은 작년 같은 기간의 매출을 뺀 기간 판매이며, 작년 같은 기간의 판매액으로 나뉩니다.)

다음 측정값 정의부터 시작해 보겠습니다.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

측정값은 올바른 결과를 생성하지만 이제 개선할 수 있는 방법을 살펴보겠습니다.

성능 향상

수식은 "작년 같은 기간"을 계산하는 식을 반복합니다. 이 수식은 Power BI가 동일한 식을 두 번 평가해야 하므로 비효율적입니다. 측정값 정의는 변수 VAR을 사용하여 보다 효율적으로 만들 수 있습니다.

다음 측정값 정의는 향상된 것을 나타냅니다. 식을 사용하여 SalesPriorYear라는 변수에 "작년 같은 기간" 결과를 할당합니다. 그런 다음 변수는 RETURN 식에서 두 번 사용됩니다.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

측정값은 계속해서 올바른 결과를 생성하며 쿼리 시간의 약 절반 정도에 해당합니다.

가독성 향상

이전 측정값 정의에서 변수 이름을 선택하면 RETURN 식을 더 쉽게 이해할 수 있습니다. 식은 짧고 자기 설명입니다.

디버깅 간소화

변수는 수식을 디버그하는 데 도움이 될 수도 있습니다. 변수에 할당된 식을 테스트하려면 RETURN 식을 일시적으로 다시 작성하여 변수를 출력합니다.

다음 측정값 정의는 SalesPriorYear 변수만 반환합니다. 의도한 RETURN 식을 주석으로 처리하는 방법을 확인합니다. 이 기술을 사용하면 디버깅이 완료되면 쉽게 다시 되돌리기 수 있습니다.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

복잡성 감소

이전 버전의 DAX에서는 변수가 아직 지원되지 않았습니다. 새 필터 컨텍스트를 도입한 복잡한 식은 EARLIER 또는 EARLIEST DAX 함수를 사용하여 외부 필터 컨텍스트를 참조해야 했습니다. 아쉽게도 데이터 모델러는 이러한 함수를 이해하고 사용하기가 어려웠습니다.

변수는 항상 RETURN 식이 적용되는 필터 외부에서 평가됩니다. 이러한 이유로 수정된 필터 컨텍스트 내에서 변수를 사용하면 EARLIEST 함수와 동일한 결과를 얻을 수 있습니다. 따라서 EARLIER 또는 EARLIEST 함수를 사용하지 않도록 할 수 있습니다. 즉, 이제 덜 복잡하고 이해하기 쉬운 수식을 작성할 수 있습니다.

Subcategory 테이블에 추가된 다음 계산 열 정의를 고려합니다. Subcategory Sales 열 값을 기반으로 각 제품 하위 범주에 대한 순위를 평가합니다.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

EARLIER 함수는 현재 행 컨텍스트에서 Subcategory Sales 열 값을 참조하는 데 사용됩니다.

EARLIER 함수 대신 변수를 사용하여 계산 열 정의를 개선할 수 있습니다. CurrentSubcategorySales 변수는 현재 행 컨텍스트에 Subcategory Sales 열 값을 저장하고 RETURN 식은 수정된 필터 컨텍스트 내에서 사용합니다.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1