共用方式為


使用變數來改善您的 DAX 公式

身為數據建模師,撰寫和偵錯某些 DAX 計算可能會很有挑戰性。 複雜計算需求通常牽涉到撰寫複合或複雜表達式,這是常見的。 複合表達式可以牽涉到使用許多巢狀函式,而且可能重複使用表達式邏輯。

在 DAX 公式中使用變數可協助您撰寫更複雜的且有效率的計算。 變數可以改善效能、可靠性、可讀性,並減少複雜性。

在本文中,我們將使用年度(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 的舊版中,尚未支援變數。 需要引進新篩選內容的複雜表達式,才能使用 EARLIEREARLIESTDAX 函式來參考外部篩選內容。 不幸的是,數據模型工具發現這些函式難以理解和使用。

變數一律會在套用 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