使用變數來改善您的 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
Related 內容
- VAR DAX 文章
- 學習 path:在 Power BI Desktop 中使用 DAX
- 有任何問題嗎? 嘗試詢問 Power BI 社群