DAX 使用者定義函數

資料分析運算式 (DAX) 使用者定義函數 (UDF) 可讓您將可重複使用的參數化 DAX 邏輯封裝到模型中,讓您的 DAX 程式碼更易於撰寫、維護和共用。 UDF 不會跨量值、計算資料行和視覺效果重複公式,而是為您的語意模型帶來程式設計樣式的彈性,讓您定義一次函式,並在支援 DAX 的任何地方使用它們。

DAX UDF自2026年6月版本起,通常可在Power BI Desktop及Power BI服務中取得。 若要深入瞭解,請參閱 DAX 使用者定義函式。

為什麼要使用使用者定義函數?

  • 可重複使用性和一致性:定義一次計算,即可在任何地方重複使用。
  • 可維護性:在一個地方更新邏輯以修復或演進規則。
  • 更安全的編寫:選擇性類型提示和類型檢查協助程式支援可預測的防錯程式碼。
  • 第一類模型物件:UDF 位於模型中,可在模型總管中檢視。

定義函數

你可以在 Power BI Desktop 中透過 DAX 查詢視圖(DQV)、TMDL 視圖或模型視圖來定義使用者自訂函式。 你也可以透過 Power BI 服務的網頁建模,在瀏覽器中查看和編輯 UDF。

一般語法

UDF 的一般語法為:

/// Optional description above the function
/// @param {ParameterType} ParameterName - ParameterDescription
/// ...
/// @returns Return description
FUNCTION <FunctionName> = ( [<ParameterName> [: [<ParameterType>] [<ParameterSubtype>] [<ParameterPassingMode>]] [= <DefaultExpression>], ...] ) => <FunctionBody>

範例:簡單的稅務函數

這是 DQV 中的一個簡單範例,它對給定金額加稅。 您也可以在 DQV 中評估 UDF。

DEFINE
    /// AddTax takes in amount and returns amount including tax
    FUNCTION AddTax = (
            amount : NUMERIC
        ) =>
        amount * 1.1

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

定義 UDF 之後,您可以更新模型,或使用程式碼透鏡將函數新增至模型。

Power BI Desktop 中 DAX 查詢檢視的螢幕擷取畫面,醒目標示出可儲存使用者自訂函式的兩個位置。第一個是檢視頂端的 [以變更更新模型] 按鈕。第二個是程式碼編輯器中標示為 [更新模型: 新增函式] 的狀態列。

同樣的範例也可以在 TMDL 檢視中建立。

createOrReplace
    /// AddTax takes in amount and returns amount including tax
    function AddTax = (amount : NUMERIC) => amount * 1.1

定義好 UDF 後,你可以對該函數進行修改,將該函式加入你的模型。

Power BI Desktop 中 TMDL 檢視的螢幕擷取畫面,醒目標示檢視頂端的 [套用] 按鈕。您可在此按鈕處儲存使用者定義函式。

管理使用者自訂函式

一旦定義並加入模型,你可以在 模型總管 的 函數 節點下查看和管理所有使用者自訂函數。

Power BI Desktop 中模型總管面板的螢幕擷取畫面,顯示已展開的函式節點。列出三個使用者自訂函式:AddTax、AverageOrderValue 和 CustomerLifetimeValue。

在 DAX 查詢檢視( DQV)中,您可以使用模型總管的 快速查詢 ,輕鬆定義與評估函式。

桌面中模型總管窗格的截圖顯示Power BI擴展後的功能節點。有兩個右鍵選單:第一個選單提供快速查詢、重命名、從模型刪除、在報表檢視中隱藏、全部解除隱藏、全部摺疊,以及全部展開。快速查詢會被標示並選取。第二個選單會被標示,並提供快速查詢選項:評估、定義與評估、定義新函數,以及定義此模型中的所有函數。

在 TMDL 檢視中,你可以將函式 拖放 到 canvas,或是透過 Model explorer 使用 Script TMDL 。

Power BI Desktop 中模型總管窗格的螢幕擷取畫面顯示已展開的 [函數] 節點。畫面中開啟了兩個內容功能表:第一個功能表提供「將 TMDL 編寫到」、「重新命名」、「從模型刪除」、「在報表檢視中隱藏」、「全部取消隱藏」、「全部摺疊」和「全部展開」等選項。其中「將 TMDL 編寫到」已醒目提示並選取。第二個功能表也已醒目提示,並提供「指令碼索引標籤」和「剪貼簿」這兩個「將 TMDL 編寫到」的選項。

若使用 Power BI Project,函式也會儲存在 functions.tmdl 資料夾中的 definition 資料夾中。

Power BI 專案的 Visual Studio Code 螢幕擷取畫面。檔案總管開啟至語意模型資料夾。在程式碼編輯器中已開啟 'functions.tmdl'。顯示了三個函式:CustomerLifetimeValue、AverageOrderValue 和 AddTax。

使用使用者自訂函式

在模型中加入 UDF 後,你可以在任何支援 DAX 的地方使用它。 這裡我們以 AddTax 為例。

使用 UDF 搭配完整的篩選上下文和 度量。

Total Sales with Tax = AddTax ( [Total Sales] )

將 UDF 套用至資料表中的每一列,並使用 計算欄位。

Sales Amount with Tax = CONVERT ( AddTax ( 'Sales'[Sales Amount] ), CURRENCY )

直接在視覺化中使用 UDF,並 透過視覺化計算。

Sales Amount with Tax = AddTax ( [Sales Amount] )

為進階情境設置巢狀 UDF。

DEFINE
    /// AddTax takes in amount and returns amount including tax
    FUNCTION AddTax = (
            amount : NUMERIC
        ) =>
        amount * 1.1

	FUNCTION AddTaxAndDiscount = (
			amount : NUMERIC,
			discount : NUMERIC
		) =>
		AddTax ( amount - discount )

EVALUATE
{ AddTaxAndDiscount ( 10, 2 ) }
// Returns 8.8

Parameters

DAX UDF 支援零個或多個參數。 為了讓你的函式更安全、更可預測,你可以選擇性地指定參數型別提示:

  • 類型:參數接受的值類型(AnyVal, Scalar, Table, AnyRefCalendarRefColumnRefMeasureRef或)。TableRef
  • 子類型(僅適用於純量類型):特定的純量資料類型(Variant、Int64DecimalDoubleStringDateTimeBoolean或)。Numeric
  • ParameterMode:引數會在何時求值(val 表示立即,expr 表示延遲)。

類型提示的形式如下: [type] [subtype] [parameterMode]

範例:類型轉換

DEFINE
    /// returns x cast to an Int64
    FUNCTION CastToInt = (
            x : SCALAR INT64 VAL
        ) =>
        x

EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5

此範例使用型 Scalar 態、 Int64 子型態與 val 參數模式。 你也可以像下面範例中那樣,直接包含 Int64 子類型來達到同樣效果。 非數字字串會導致錯誤。

DEFINE
    /// returns x as an Int64
    FUNCTION CastToInt = (
            x : INT64
        ) =>
        x

EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5

類型檢查

利用內建的 DAX 型別檢查函式來驗證函式內的參數型別,例如:

欲了解完整的型別檢查功能清單,請參見 DAX 使用者定義函式。

欲了解更多使用使用者自訂函式的資訊,請參閱以下資源: