共用方式為


DAX 概觀

數據分析表達式 (DAX) 是 Analysis Services、Power BI 和 Excel 中的 Power Pivot 中使用的公式運算式語言。 DAX 公式包括函數、運算符和值,以針對表格式數據模型中相關數據表和數據行中的數據執行進階計算和查詢。

本文僅提供 DAX中最重要的概念基本簡介。 其描述 DAX 適用於所有使用它的產品。 某些功能可能不適用於特定產品或使用案例。 請參閱產品文件,其中說明 DAX 的特定實作。

計算

DAX 公式用於量值、計算欄、計算表和資料列層級安全性。

措施

量值是動態計算公式,其結果會根據內容而變更。 報表中使用的量值,其支援透過使用多個屬性 (例如 Power BI 報表或 Excel 樞紐分析表或樞紐分析圖) 來結合並篩選模型資料。 量值是使用模型設計工具中的 DAX 公式列所建立。

量值中的公式可以使用自動總和功能自動建立的標準聚合函數,例如 COUNT 或 SUM,或者您可以使用公式列來定義自己的公式 DAX 。 具名量值可以當作引數傳遞給其他量值。

當您在公式列中定義量值的公式時,工具提示功能會針對目前內容中總計顯示其結果的預覽;否則結果不會立即輸出到任何位置。 您無法立即看到(篩選後)計算結果的原因,是因為在沒有上下文的情況下,無法判斷度量的結果。 評估量值需要報表用戶端應用程式,才能提供擷取每個資料格相關資料所需的內容,然後針對每個資料格來評估運算式。 該用戶端可能是 SQL Server Management Studio 中查詢中的 DAX Excel 數據透視表或樞紐分析圖、Power BI 報表或數據表運算式。

不論用戶端為何,都會針對結果中的每個資料格執行個別查詢。 亦即,樞紐分析表中每個列標題和欄標題的組合,或在 Power BI 報表中選擇的交叉分析篩選器和篩選器,都會產生不同的資料子集,並依此子集計算度量值。 例如,使用這個非常簡單的量值公式:

Total Sales = SUM([Sales Amount])

當使用者將 TotalSales 量值放在報表中,然後將產品類別資料行從產品資料表放入 [篩選條件] 時,就會針對每個產品類別目錄計算並顯示銷售金額的總和。

不同於計算結果資料行,量值語法會包含公式前面的量值名稱。 在剛才提供的範例中,總銷售額的名稱會顯示在公式前面。 建立量值之後,名稱及其定義會出現在報表用戶端應用程式欄位清單中,且會根據檢視方塊和角色提供給模型的所有使用者。

若要深入瞭解,請參閱:Power Pivot 中 Analysis Services 量值的 Power BI Desktop量值中的量值

計算結果欄

計算欄是您新增至現有數據表的欄位(在模型設計工具中),然後建立DAX公式來定義該欄的值。 當計算結果列包含有效的 DAX 公式時,只要輸入公式,就會針對每個數據列計算值。 然後,值會儲存在記憶體中的資料模型中。 例如,在日期資料表中將公式輸入公式列時:

= [Calendar Year] & " Q" & [Calendar Quarter]

在資料表中,每一列的值是透過以下方式計算:先從日曆年度欄位(在同一日期資料表中)取得值,接著加入一個空格和大寫字母 "Q",再添加來自日曆季度欄位(在同一日期資料表中)的值。 計算結果欄中每個資料列的結果會立即計算並顯示,例如,2017 Q1。 只有在處理 (重新整理) 資料表或任何相關資料表時,才會重新計算資料行值,或從記憶體中卸載模型然後重新載入,就像關閉和重新開啟 Power BI Desktop 檔案一樣。

若要深入瞭解,請參閱:Power BI Desktop 中的計算欄Analysis Services 中的計算欄Power Pivot 中的計算欄

計算資料表

計算資料表是以公式運算式為基礎的計算物件,其衍生自相同模型中的所有或部分其他資料表。 藉由 DAX 公式定義數據表的值,而不是從數據源查詢並載入到新數據表的數據列。

在角色扮演維度中,計算資料表十分有幫助。 一個例子是日期資料表,例如 OrderDate、ShipDate 或 DueDate,它們都取決於外部索引鍵的關係。 藉由明確地建立 ShipDate 的計算資料表,您會取得可供查詢使用的獨立資料表,如同任何其他資料表一樣。 當您設定經過篩選的資料列集合或其他現有資料表中資料行的子集或超集時,計算資料表也很有用。 這可讓您將原始資料表保持不變,同時建立該資料表的變化以支援特定案例。

計算資料表支援與其他資料表建立關聯。 導出資料表中的資料行具有資料類型、格式,並可能屬於某種資料類別。 計算資料表可以像任何其他資料表一樣命名、呈現或隱藏。 如果從中提取資料的任何資料表已重新整理或更新,則會重新計算計算資料表。

若要深入瞭解,請查看:Power BI Desktop 中的計算表Analysis Services 中的計算表

資料列層級安全性

使用數據列層級安全性時, DAX 公式必須評估為布爾 TRUE/FALSE 條件,並定義特定角色成員查詢的結果可以傳回哪些數據列。 例如,針對銷售角色的成員,包含以下 DAX 公式的 Customers 資料表:

= Customers[Country] = "USA"

銷售角色的成員只能檢視美國客戶的數據,而匯總,例如 SUM 只會針對美國的客戶傳回。 Excel 中的 Power Pivot 無法使用資料列層級安全性。

使用 DAX 公式定義行級安全性時,您正在建立一個允許的資料行集。 這不會拒絕存取其他資料列;更確切地說,這些資料列不會當作允許的資料列集一部分傳回。 其他角色可以允許存取 DAX 公式所排除的數據列。 如果使用者是另一個角色的成員,且該角色的資料列層級安全性允許存取該特定資料列集,則使用者可以查看該資料列的資料。

列級別安全性公式會應用於指定資料列及其相關的資料列。 當資料表具有多個關聯性時,篩選條件會針對使用中的關聯性來套用安全性。 資料列層級安全性公式會與針對相關資料表定義的其他公式交集。

若要深入瞭解,請參閱:使用 Power BI 的行級別安全性 (RLS)Analysis Services 中的角色

查詢

DAX 您可以在 SQL Server Management Studio (SSMS) 和開放原始碼工具中建立並執行查詢,例如 DAX Studio (daxstudio.org)。 不同於只能在表格式數據模型中建立的 DAX 計算公式,DAX 查詢也可以針對 Analysis Services 多維度模型執行。 DAX 查詢通常比多維度數據表達式 (MDX) 查詢更容易撰寫且更有效率。

DAX 查詢是語句,類似於 T-SQL 中的 SELECT 語句。 最基本的查詢類型 DAX 是 評估 語句。 例如,

EVALUATE
 ( FILTER ( 'DimProduct', [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC

在結果中傳回資料表,其中僅列出 SafetyStockLevel 小於 200 的產品 (依 EnglishProductName 的遞增順序)。

您可以建立量值作為查詢的一部分。 量值只會在查詢期間存在。 若要深入瞭解,請參閱 DAX的查詢。

公式

DAX 公式對於在計算欄和量值中建立計算,以及使用資料列層級安全性來保護您的資料而言非常重要。 若要建立計算結果列和量值的公式,請使用模型設計工具視窗頂端或 DAX 編輯器頂端的公式列。 若要建立資料列層級安全性的公式,請使用 [角色管理員] 或 [管理角色] 對話方塊。 本節中的資訊旨在讓您開始瞭解 DAX 公式的基本概念。

公式基礎

DAX 公式可能非常簡單或相當複雜。 下表顯示一些可在計算結果欄中使用的簡單公式範例。

公式 定義
= TODAY() 在計算欄位的每一列中插入今天的日期。
= 3 在計算結果欄的每個資料列中插入值 3。
= [Column1] + [Column2] 在 [Column1] 和 [Column2] 的相同資料列中新增值,並將結果放在同一個資料列的計算結果欄中。

無論所建立的公式是簡單或複雜,您都可以在建立公式時使用下列步驟:

  1. 每個公式都必須以等號 (=) 開頭。

  2. 您可以鍵入或選取函式名稱,或鍵入運算式。

  3. 開始鍵入函式或所需名稱的前幾個字母,AutoComplete 會顯示可用函式、資料表和資料行的清單。 按 TAB 鍵,將項目從 AutoComplete 清單新增至公式。

    您也可以按一下 [Fx] 按鈕以顯示可用的函式清單。 若要從下拉式清單中選取函式,請使用方向鍵來醒目提示該項目,然後按一下 [確定] 將函式新增至公式。

  4. 透過從下拉式選單中選擇可能的資料表和資料行,或直接輸入值,供應引數至函式。

  5. 檢查語法錯誤:請確認所有括號都已閉合,並正確地引用了欄位、表格和值。

  6. 按 ENTER 以接受公式。

注意

在計算結果欄中,只要您輸入公式並驗證公式,資料行就會填入值。 在量值中,按 ENTER 會將量值定義與資料表一起儲存。 如果公式無效,則會顯示錯誤。

在此範例中,讓我們來看看名為 [目前季度中的天數] 量值中的公式:

Days in Current Quarter = COUNTROWS( DATESBETWEEN( 'Date'[Date], STARTOFQUARTER( LASTDATE('Date'[Date])), ENDOFQUARTER('Date'[Date])))

此量值用於在不完整期間和上一個期間之間建立比較比例。 公式必須考慮經過的期間比例,並與前一個期間的相同比例進行比較。 在此情況下,[目前季度至今的天數]/[目前季中的天數] 會提供目前期間內經過的比例。

此公式包含下列項目:

公式項目 說明
Days in Current Quarter 量值的名稱。
= 等號 (=) 會開始公式。
COUNTROWS COUNTROWS 計算 Date 資料表中的數據列數目
() 左右括弧會指定引數。
DATESBETWEEN 此 DATESBETWEEN 函式會傳回 Date 資料表中 Date 資料行中每個值最後一個日期之間的日期。
'Date' 指定日期資料表。 資料表是以單引號括住。
[Date] 指定日期資料表中的日期資料行。 欄位是以中括號括住。
,
STARTOFQUARTER 函 STARTOFQUARTER 式會傳回季開始的日期。
LASTDATE LASTDATE 函數會傳回季度的最後一天。
'Date' 指定日期資料表。
[Date] 指定日期資料表中的日期資料行。
,
ENDOFQUARTER ENDOFQUARTER 函式
'Date' 指定日期資料表。
[Date] 指定日期資料表中的日期資料行。

使用 AutoComplete 公式

AutoComplete 可讓您為公式中的每個項目提供選項,以協助您輸入有效的公式語法。

  • 您可以在現有公式中間使用具有巢狀函式的 AutoComplete 公式。 插入點前方文字會用來顯示下拉式清單中的值,而插入點後方的所有文字則保持不變。

  • AutoComplete 不會新增函式的右括弧,也不會自動比對括弧。 您必須確定每個函式的語法都正確,否則將無法儲存或使用公式。

在公式中使用多個函式

您可以嵌套函數,這就表示您可以使用一個函數的結果作為另一個函數的引數。 您最多可以在計算結果欄中巢狀 64 個層級的函式。 不過,巢狀結構可能會使公式難以設置或進行故障排除。 許多函式的設計都是單獨當作巢狀函式使用。 這些功能會傳回一個資料表,這個資料表無法直接儲存為結果,因此必須作為處理資料表的函式的輸入。 例如,函式 SUMX、 AVERAGEX和 MINX 全都需要數據表做為第一個自變數。

功能

函式是運算式中的具名公式。 大部分的函式都有必要與選擇性引數 (亦稱為參數) 作為輸入。 當函式執行時,會傳回值。 DAX 包含您可以使用日期和時間執行計算的函式、建立條件值、使用字串、根據關聯性執行查閱,以及逐一查看數據表以執行遞歸計算的能力。 如果您熟悉 Excel 公式,其中許多函式看起來會非常類似;不過, DAX 公式在下列重要方面不同:

  • 函數 DAX 總是參考完整的欄或表格。 如果您只想使用某個資料表或資料行中的特定值,您可以將篩選條件加入公式。

  • 如果您需要依數據列自定義計算, DAX 請提供函式,讓您使用目前的數據列值或相關值做為參數類型,以執行依內容而有所不同的計算。 若要了解這些函式的運作方式,請參閱本文中的內容

  • DAX 包含許多傳回數據表的函式,而不是值。 該資料表不會顯示於報表用戶端中,但會用來提供其他函式的輸入。 例如,您可以擷取資料表,然後計算其中的相異值;或者計算所篩選的不同資料表或資料行的動態總和。

  • DAX 函式包含各種 時序智能 函式。 這些函式可讓您定義或選取日期範圍,並以日期或範圍為依據來執行動態計算。 例如,您可以比較不同平行區間的總和。

彙總函數

匯總函數會計算表達式所定義之數據行或數據表中所有數據列的計數、總和、平均值、最小值或最大值等值。 若要深入了解,請參閱彙總函式

日期和時間函式

中的 DAX 日期和時間函式與 Microsoft Excel 中的日期和時間函式類似。 不過,自 1900 年 3 月 1 日起,DAX 函式是以 datetime 數據類型為基礎。 若要深入了解,請參閱日期和時間函式

篩選函式

DAX 的篩選函式會傳回特定的資料類型、在相關表格中查詢值,並依相關值進行篩選。 查閱函式的運作方式是使用數據表和關聯性,例如資料庫。 篩選函式可讓您操作資料內容以建立動態計算。 若要深入了解,請參閱篩選函式

財務功能

中的 DAX 財務函式會用於執行財務計算的公式,例如凈現值和報酬率。 這些函式類似於 Microsoft Excel 中使用的財務函式。 若要深入了解,請參閱財務函式

資訊函數

資訊函式會查看當作引數提供的資料格或資料列,並告訴您其值是否符合預期的類型。 例如,如果參考的值包含錯誤,ISERROR 函式會傳回 TRUE。 若要深入了解,請參閱資訊函式

邏輯函式

邏輯函式作用於運算式,以傳回有關運算式中值的資訊。 例如,TRUE 函式可讓您知道評估的表達式是否傳回 TRUE 值。 若要深入了解,請參閱邏輯函式

數學運算和三角函數

中的 DAX 數學函式與 Excel 數學和三角函數非常類似。 DAX 函式所使用的數值數據類型中存在一些次要差異。 若要深入了解,請參閱數學和三角函式

其他函式

這些函式會執行大部分其他函式所屬任何類別無法定義的唯一動作。 若要深入了解,請參閱其他函式

關係功能

中的 DAX 關聯性函式可讓您從另一個相關數據表傳回值、指定要在表達式中使用的特定關聯性,以及指定交叉篩選方向。 若要深入了解,請參閱關聯性函式

統計函式

統計函數會計算與統計分佈和機率相關的值,例如標準偏差和排列數目。 若要深入了解,請參閱統計函式

文字功能

DAX 中的文字函式與 Excel 中對應的文字函式非常類似。 您可以傳回字串的一部分、在字串中搜尋文字,或串連字串值。 DAX 也提供用來控制日期、時間和數位格式的函式。 若要深入了解,請參閱文字函式

時間智能函數

在 DAX 提供的時間智慧功能中,您可以創建利用內建行事曆和日期知識的計算。 藉由在匯總或計算過程中使用時間和日期範圍,您可以在可比較的時段內針對銷售、庫存等建立有意義的比較。 若要深入瞭解,請參閱 時間智慧函式 (DAX)

資料表操作函式

這些函式會傳回數據表或操作現有的數據表。 例如,您可以使用 ADDCOLUMNS 將匯出資料行新增至指定的數據表,或者您可以使用 函式,透過一組群組 SUMMARIZECOLUMNS 傳回摘要數據表。 若要深入了解,請參閱資料表操作函式

變數

您可以使用 VAR,在表示式內建立變數。 VAR 在技術上不是函式,它是將表達式的結果儲存為具名變數的關鍵詞。 然後該變數會作為引數傳遞給其他量值運算式。 例如:

VAR
    TotalQty = SUM ( Sales[Quantity] )

Return

    IF (
        TotalQty > 1000,
        TotalQty * 0.95,
        TotalQty * 1.25
        )

在此範例中,可以將 TotalQty 作為命名變數傳遞給其他運算式。 變數可以是任何純量資料類型,包括資料表。 使用變數在您的 DAX 公式中可以極具效力。

資料類型

您可從可能支援不同資料類型的多個不同資料來源將資料匯入模型中。 當將資料匯入模型時,資料會轉換成其中一個表格式模型資料類型。 當模型數據用於計算時,數據會接著轉換成 DAX 計算持續時間和輸出的數據類型。 當您建立 DAX 公式時,公式中使用的詞彙會自動判斷傳回的值數據類型。

DAX 支援下列資料類型:

模型中的資料類型 DAX 中的數據類型 說明
Whole Number 64 位元 (八位元組) 整數值 1、2 不包含小數位的數字。 整數可以是正數或負數,但必須是介於 -9,223,372,036,854,775,808 (-2^63) 和 9,223,372,036,854,775,807 (2^63-1) 之間的整數。
Decimal Number 64 位元 (八位元組) 實數 1、2 實數是可以包含小數位的數。 實數涵蓋廣泛的值:

從 -1.79E +308 到 -2.23E -308 的負值



從 2.23E -308 到 1.79E + 308 的正值

不過,有效位數的數目限制為 17 個小數位數。
Boolean 布爾邏輯 真或假值。
Text 字串 Unicode 字元數據字串。 可以是字串或數字,或以文字格式表示的日期。
Date 日期/時間 日期和時間在公認的日期時間表示法中。

有效日期都是 1900 年 3 月 1 日之後的所有日期。
Currency 貨幣 貨幣資料類型允許的值範圍為 -922,337,203,685,477.5808 到 922,337,203,685,477.5807,且具有四位小數的固定精度。
Variant 變數 用於可能傳回不同數據類型的表達式,例如 DAX 量值。 例如, DAX 傳回整數或字串的量值會是 variant 類型。
N/A 空白 在DAX中,空白值是一種數據類型,用來表示和取代 SQL Null。 您可以使用 函 BLANK 式建立空白,並使用邏輯 ISBLANK函式測試空白。

表格式數據模型也包含 Table 資料類型做為許多 DAX 函式的輸入或輸出。 例如,函式會 FILTER 接受數據表做為輸入,並輸出另一個只包含符合篩選條件之數據列的數據表。 您可以藉由結合資料表函式與彙總函式,對以動態方式定義的資料集執行複雜計算。

雖然數據類型通常會自動設定,但請務必了解數據類型,以及它們對公式的適用方式。 例如,公式或非預期結果中的錯誤,通常是使用無法與引數中所指定資料類型搭配使用的特定運算子所造成。 例如,公式 = 1 & 2 會傳回字串結果 12。 不過,公式 = "1" + "2" 會傳回整數結果 3。

注意

字串數據類型的計算可能會限製為 64kb。

上下文

Context 是建立 DAX 公式時要瞭解的重要概念。 上下文使您能夠執行動態分析,因為公式結果會根據目前資料列或儲存格的選擇及相關資料進行變更並反映出來。 了解內容並有效使用內容,對於建置高效能的動態分析、以及對公式中的問題進行疑難排解都非常重要。

取決於其他設計元素,可以在不同背景中評估表格式模型中的公式。

  • 套用於樞紐分析表或報表中的篩選條件
  • 在公式內定義的篩選條件
  • 在公式內使用特殊函式所指定的關聯性

內容有不同的類型:「資料列內容」、「查詢內容」和「篩選內容」

列情境

「資料列內容」可以視為「目前的資料列」。 如果您在計算結果欄中建立公式,則該公式的資料列內容,就會包含目前資料列中所有資料行的值。 如果資料表與另一個資料表相關,則內容也會包含在另一個資料表中與目前資料列相關的所有值。

例如,假設您建立了一個計算的欄位 = [Freight] + [Tax],將來自相同資料表的兩個欄位,運費和稅金的值相加。 此公式只會從指定資料行中的目前資料列自動取得值。

數據列內容也會遵循數據表之間定義的任何關聯性,包括使用 DAX 公式在匯出數據行內定義的關聯性,以判斷相關數據表中哪些數據列與目前數據列相關聯。

例如,下列公式會使用 函 RELATED 式,根據訂單寄送到的區域,從相關數據表擷取稅值。 稅金值的確定方式是使用目前資料表中區域值、在相關資料表中查閱該區域,然後從相關資料表取得該區域的稅率。

= [Freight] + RELATED('Region'[TaxRate])

此公式會從區域資料表中取得目前區域的稅率,並將其新增至運費資料行的值。 在 DAX 公式中,您不需要知道或指定連接數據表的具體關係。

多個資料列內容

DAX 包含可在表格中重複進行計算的函式。 這些函式可以具有多個目前的資料列,每個都有自己的資料列內容。 基本上,這些函式可讓您建立以遞迴方式執行內部和外部迴圈作業的公式。

例如,假設模型包含 [產品] 資料表和 [銷售] 資料表。 使用者可能會想要瀏覽整個銷售資料表 (此資料表是與多項產品相關的交易),並找出任何一筆交易中針對每個產品訂購的最大數量。

您可以 DAX 建置傳回正確值的單一公式,而且每當使用者將數據新增至數據表時,結果就會自動更新。

= MAXX(FILTER(Sales,[ProdKey] = EARLIER([ProdKey])),Sales[OrderQty])

如需此公式的詳細範例,請參閱 EARLIER

總而言之,EARLIER 函式會儲存前一個作業的列上下文。 函式會隨時在記憶體中儲存兩組內容:一組內容代表公式內部迴圈的目前資料列,另一組內容代表公式外部迴圈的目前資料列。 DAX 會自動提供兩個循環之間的值,以便您可以建立複雜的匯總。

查詢背景

「查詢內容」代表針對公式隱含擷取的資料子集。 例如,當使用者將度量值或欄位放入報告中時,引擎會檢查資料列和資料行標頭、交叉分析篩選器和報告篩選條件以判斷上下文。 然後,系統會針對模型資料執行必要的查詢,以取得正確的資料子集、進行公式所定義的計算,然後在報告中填入值。

因為內容會根據您放置公式的位置而變更,所以公式的結果也會變更。 例如,假設您建立了一個公式來加總 [收益] 欄位中的值於 [銷售] 資料表中:。 如果您在 [銷售] 資料表內的計算結果欄中使用此公式,則整個資料表的公式結果都相同,因為公式查詢內容一律是 [銷售] 資料表的整個資料集。 計算結果會給所有地區、所有產品、所有年度等帶來利潤。

不過,使用者通常不會想要看到相同結果數百次,而是想要取得特定年度、特定國家、特定產品的利潤,或這些當中的某種組合,然後取得總計。

在報告中,可藉由篩選、新增或移除欄位,以及使用切片器來變更內容。 針對每項變更,評估其在查詢內容中的指標。 因此,用於量值中的相同公式會針對每個資料格在不同「查詢內容」中進行評估。

篩選內容

「篩選內容」是每個資料行中允許的一組值,或從相關資料表中擷取的值。 篩選可以套用至桌面中的數據行,或在呈現層中套用(報表和數據透視表)。 篩選條件也可以由公式內的篩選條件運算式來明確定義。

當您使用公式引數在資料行或資料表中指定允許值集的篩選條件時,會新增篩選內容範圍。 篩選內容會套用至其他內容 (例如資料列內容或查詢內容) 之上。

在表格式模型中,有許多方式可以建立篩選上下文。 在能夠使用模型的用戶端環境中(例如 Power BI 報表),使用者可以通過在資料列和資料行標題上新增交叉分析篩選器或報表篩選來瞬間創建篩選條件。 您還可以直接在公式中指定篩選運算式,以指定相關的值、篩選用作輸入的資料表,或動態獲取用於計算值的上下文。 您也可以完全清除或選擇性清除特定欄上的篩選條件。 在建立計算總計的公式時,這非常有用。

若要深入瞭解如何在公式內建立篩選,請參閱函FILTER式 (DAX)。 若需範例說明如何清除篩選來創建總計,請參閱函ALL式(DAX)

如需如何在公式中選擇性清除和套用篩選的範例,請參閱 ALLEXCEPT

判斷公式中的內容

當您建立 DAX 公式時,公式會先測試有效的語法,然後測試以確定公式中包含的數據行和數據表名稱可以在目前的內容中找到。 如果找不到公式所指定的任何資料行或資料表,就會傳回錯誤。

在驗證和重新計算作業期間,內容的判斷方式是根據模型中可用的資料表、資料表之間的關聯性,以及已套用的篩選條件,如先前的章節所述來確定的。

例如,如果您剛將一些資料匯入新的資料表,且此資料表與其他任何資料表無關 (且您尚未套用任何篩選條件),則「目前內容」是資料表中的整個資料行集。 如果資料表是由與其他資料表的關聯性所連結,則目前內容會包含相關資料表。 如果您將資料表中的資料行新增至具有交叉分析篩選器的報表,並且報表可能包含一些篩選器時,則公式的內容是報表中每個資料格的資料子集。

內容是一種有力的概念,但也很難針對公式進行疑難排解。 我們建議從簡單的公式和關聯性開始,以了解內容的運作方式。 下節提供一些範例來說明公式如何使用不同類型的內容以動態方式傳回結果。

操作員

DAX 語言在公式中使用四種不同類型的計算運算子:

  • 比較運算子用於比較數值並傳回邏輯值TRUE「FALSE」。
  • 算術運算子,用來執行會傳回數值的算術計算。
  • 文字串連運算子,可聯結兩個或多個文字字串。
  • 結合兩個或多個運算式來傳回單一結果的邏輯運算子。

如需 DAX 公式中使用的運算子詳細資訊,請參閱 DAX 運算子

使用資料表和欄

表格式資料模型中的資料表看起來像 Excel 資料表,但其使用資料和公式的方式不同:

  • 公式僅適用於表格和欄,而不是個別儲存格、範圍參考或陣列。
  • 公式可以使用關聯性來取得相關資料表中的值。 所擷取值一律與目前的資料列值相關。
  • 您無法像在 Excel 工作表中那樣,擁有不規則或「零散」的資料。 資料表中每個資料列都必須包含相同數目的資料行。 不過,某些欄位可以是空白值。 Excel 資料資料表和表格式模型資料表無法互換。
  • 因為資料類型已針對每個資料行進行設定,所以該資料行中的每個值都必須是相同類型。

在公式中參考資料表和資料行

您可以使用資料表和資料行的名稱來參考它們。 例如,下列公式說明如何使用「完整限定」名稱來參考兩個資料表中的資料行:


= SUM('New Sales'[Amount]) + SUM('Past Sales'[Amount])

當公式被評估時,模型設計者會先檢查一般語法,然後按照目前上下文檢查您提供的資料行和資料表名稱是否與可能的資料行和資料表相符。 如果名稱模棱兩可,或找不到數據行或數據表,您就會在公式上收到錯誤(#ERROR 字串,而不是發生錯誤的單元格中的數據值)。 若要深入了解數據表、數據行和其他物件的命名需求,請參閱語法中的DAX命名需求。

資料表關聯性

藉由建立資料表之間的關聯性,您可以取得其他資料表中的相關值,以用於計算。 例如,您可以使用計算結果欄來判斷與目前轉銷商相關的所有出貨記錄,然後加總每個記錄的出貨成本。 不過,在許多情況下,不一定需要關聯性。 您可以在公式中使用 函LOOKUPVALUE式,針對符合 search_columnsearch_value 自變數中所指定準則的數據列,傳回 result_columnName 中的值。

許多 DAX 函式要求數據表之間或多個數據表之間存在關聯性,才能找出您參考的數據行,並傳回有意義的結果。 其他函式將會嘗試識別關聯性;不過,為了獲得最佳結果,您應該一律盡可能建立關聯性。 表格式資料模型支援資料表之間的多個關聯性。 為了避免混淆或不正確的結果,一次只會將一個關聯性指定為作用中的關聯性,但是您可以視需要變更作用中的關聯性,以便在計算時遍歷資料中的不同連線。 USERELATIONSHIP 函式可用來指定要用於特定計算的一或多個關聯性。

使用關聯性時,請務必觀察這些公式設計規則:

  • 當資料表透過關聯性相連時,您必須確定當作索引鍵使用的兩個資料行具有符合值。 參照完整性不會被強制執行,因此索引鍵資料行中可能會有不匹配的值,但仍然可以建立關聯。 如果發生此情況,則應該注意空白值或不相符值可能會影響公式的結果。

  • 當您使用關聯來連結模型中的資料表時,您會擴大評估公式的範圍,也就是說,增大它們被評估時的背景。 因新增資料表、新關聯性或現用關聯性的變更而引起的內容變動,可能會導致結果以您無法預期的方式改變。 若要深入了解,請參閱本文中的內容

處理和重新整理

「處理」和「重新計算」是兩個不同但相關的作業。 在設計包含複雜公式、大量資料或從外部資料來源所取得資料的模型時,您應該透徹了解這些概念。

「處理 (重新整理)」會使用外部資料來源的新資料來更新模型中資料。

「重新計算」會更新公式結果的程序,以反映公式本身的任何變更,並反映基礎資料的變更。 重新計算會以下列方式影響效能:

  • 計算結果欄中的值會計算並儲存在模型中。 若要更新計算結果欄中的值,您必須使用三個處理命令的其中之一來處理模型 - 完整處理、處理資料或處理重新計算。 每當變更公式時,公式的結果必須一律針對整個資料行重新計算。

  • 每當使用者將量值新增至樞紐分析表或開啟報表時,即會以動態方式評估量值所計算的值;當使用者修改內容時,量值所傳回的值會變更。 測量結果總是反映記憶體快取中的最新狀態。

除非重新計算的結果傳回不同值,其使資料列可供查詢或無法供角色成員查詢,否則處理和重新計算不會影響資料列層級安全性公式。

更新

DAX 正在持續改進。 新的和更新的函式會與下一個可用的更新一起發行,通常是每月發行。 服務會先更新,接著是已安裝應用程式,例如 Power BI Desktop、Excel、SQL Server Management Studio (SSMS) 和適用於 Visual Studio 的 Analysis Services 專案延伸模組 (SSDT)。 SQL Server Analysis Services 會與下一個累積更新一起更新。 新函式會在 Power BI Desktop 更新時首先於 DAX 函式參考中宣告並描述。

在舊版的 SQL Server Analysis Services 和 Excel 中,並非所有函式都受到支援。

疑難排解

如果在定義公式時收到錯誤,則公式可能包含「語法錯誤」、「語意錯誤」或「計算錯誤」

語意錯誤是最容易解決的。 它們通常涉及遺漏括弧或逗號。

當語法正確時,就會發生另一種類型的錯誤,但是參考的值或資料行在公式內容中並沒有意義。 這類語法和計算錯誤可能是由下列任何問題所造成:

  • 此公式參考不存在的資料行、資料表或函式。
  • 公式看起來正確,但是當資料引擎擷取資料時,公式發現類型不符並引發錯誤。
  • 公式傳遞不正確的引數數目或類型給函式。
  • 此公式參考具有錯誤的不同資料行,因此其值無效。
  • 此公式參考尚未處理的資料行,這表示公式具有中繼資料,但沒有實際資料可用於計算。

在前四個案例中,DAX 會標幟包含無效公式的整個欄。 在最後一個案例中, DAX 會將數據行呈現灰色,以指出數據行處於未處理狀態。

應用程式和工具

Power BI 桌面版

Power BI Desktop

Power BI Desktop 是免費的資料模型和報表應用程式。 模型設計工具包含用於建立 DAX 計算公式的 DAX 編輯器。

Excel 中的 Power Pivot

Excel 中的 Power Pivot

Excel 模型中的 Power Pivot 設計工具包含用來DAX建立DAX計算公式的編輯器。

Visual Studio

Visual Studio

Visual Studio (具備 Analysis Services 專案延伸模組 (VSIX)) 會用來建立 Analysis Services 模型專案。 與專案擴充模組一起安裝的表格模型設計器包含 DAX 編輯器。

SQL Server Management Studio

SQL Server Management Studio

SQL Server Management Studio (SSMS) 是使用 Analysis Services 的基本工具。 SSMS 包含查詢 DAX 編輯器,可查詢表格式和多維度模型。

DAX 演播室

DAX Studio 圖示

DAX Studio 是開放原始碼用戶端工具,可用於在 Excel 模型中建立和執行 DAX Analysis Services、Power BI Desktop 和 Power Pivot 的查詢。

表格編輯器

Tabular Editor 圖示

表格式編輯器是一個開放原始碼工具,可提供表格式模型中繼資料中每個物件的直覺、階層式檢視。 表格式編輯器包含具有語法醒目提示的DAX編輯器,提供編輯量值、計算結果列和計算結果表表達式的簡單方式。

學習資源

學習 DAX時,最好使用您將用來建立數據模型的應用程式。 Excel 中的 Analysis Services、Power BI Desktop 和 Power Pivot 都有文章和教學課程,包括使用 DAX建立量值、計算結果列和數據列篩選的課程。 以下是一些額外資源:

Videos

在 DAX Power BI Desktop 學習路徑中使用。

阿爾貝托·法拉利和馬可·魯索著的《權威指南DAX》(Microsoft出版)。 本指南目前已出版到第二版,為資料模型初學者和 BI 專業人士提供從基礎到創新高效能技術的全面指導。

The Definitive Guide to DAX book image 書籍圖像的明確指南

社群

DAX 有一個充滿活力的社區,總是願意分享他們的專業知識。 Microsoft Power BI 社群 有僅供 DAX、 DAX 命令和秘訣的特殊討論論壇。