共用方式為


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

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

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

在本文中,我們將示範 first 三大優點,使用 year-over-year(YoY)銷售成長的範例 measure。 (同比銷售增長的公式為週期銷售,減去同期銷售 lastyear,除以同期銷售 lastyear。

讓我們從下列 measure 定義開始。

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

measure 會產生正確的結果,但讓我們 now 瞭解如何加以改善。

改善效能

請注意,公式會重複計算「相同期間 lastyear」的表達式。 此公式效率不佳,因為它需要 Power BI 來 evaluate 相同的表達式兩次。 measure 定義可以透過使用變數 VAR變得更有效率。

下列 measure 定義代表改進。 它會使用表達式將 「same period lastyear」 結果指派給名為 SalesPriorYear的變數。 然後,該變數會在 RETURN 運算式中被使用兩次。

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

measure 持續呈現正確的結果,而 and 僅在大約一半的查詢中對 time發揮作用。

改善可讀性

在 previousmeasure 定義中,請注意變數名稱的選擇如何讓 RETURN 運算式更容易瞭解。 表達式簡短 and 自我描述。

簡化偵錯

變數也可以協助您對公式進行偵錯。 若要測試指派給變數的運算式,您可以暫時重寫 RETURN 運算式來輸出變數。

下列 measure 定義只會傳回 SalesPriorYear 變數。 請注意其如何將預定的 RETURN 運算式標記為註解。 這項技巧可讓您在完成偵錯後,再輕鬆地將運算式還原回來。

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

降低複雜性

在 earlierDAX版本中,not 支援變數。 引入新 filter 上下文的複雜表達式需要使用 EARLIERorEARLIESTDAX 函式來參考外部 filter 上下文。 不幸的是,數據模型化工具發現這些函式難以理解 and 使用。

在 filters RETURN 運算式之外,變數始終會被評估。 基於這個理由,當您在修改過的 filter 內容中使用變數時,它會達到與 EARLIEST 函式相同的結果。 因此,可以避免使用 EARLIERorEARLIEST 函式。 這表示您可以 now 撰寫較不複雜的公式,and 更容易理解。

請考慮下列新增至 Subcategory 資料表中的計算結果欄定義。 它會以 Subcategory Sales 欄位 values為基準,評估每個 product 子類別的 rank。

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

函式用於參考在當前行上下文中的 子類別銷售

您可以使用變數來改善匯出數據行定義,而不是使用 EARLIER 函式。 CurrentSubcategorySales 變數會將 Subcategory Sales 數據行 value儲存在目前數據列內容中,and RETURN 表達式會在修改的 filter 內容內使用它。

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