DAX 概觀
資料分析運算式 (DAX) 是 Excel 中 Analysis Services、Power BI 和 Power Pivot 使用的公式運算式語言。 DAX 公式包含函式、運算子和值,可對表格式資料模型中相關資料表和資料行中的資料執行進階計算和查詢。
本文僅提供 DAX 中最重要概念的基本簡介。 本文描述 DAX,因為其適用於所有使用 DAX 的產品。 某些功能可能不適用於特定產品或使用案例。 請參閱產品文件以了解其 DAX 的特定實作。
計算
DAX 公式用於量值、計算結果欄、計算資料表和資料列層級安全性。
量值
量值是動態計算公式,其結果會根據內容而變更。 報表中使用的量值,其支援透過使用多個屬性 (例如 Power BI 報表或 Excel 樞紐分析表或樞紐分析圖) 來結合並篩選模型資料。 量值是使用模型設計工具中的 DAX 公式列所建立。
量值中的公式,可以使用自動產生的標準彙總函式 (例如 COUNT 或 SUM),或您也可以使用 DAX 公式列來定義自己的公式。 具名量值可以當作引數傳遞給其他量值。
當您在公式列中定義量值的公式時,工具提示功能會針對目前內容中總計顯示其結果的預覽;否則結果不會立即輸出到任何位置。 您無法立即看到計算結果的原因,是因為無法在沒有內容的情況下判斷量值結果。 評估量值需要報表用戶端應用程式,才能提供擷取每個資料格相關資料所需的內容,然後針對每個資料格來評估運算式。 該用戶端可能是 Excel 樞紐分析表或樞紐分析圖、Power BI 報表,或 SQL Server Management Studio (SSMS) 中 DAX 查詢的資料表運算式。
不論用戶端為何,都會針對結果中的每個資料格執行個別查詢。 亦即,樞紐分析表中的每個資料列和資料行標頭組合,或 Power BI 報表中交叉分析篩選器和篩選的每一個選擇都會產生不同資料子集,並根據該子集計算量值。 例如,使用這個非常簡單的量值公式:
Total Sales = SUM([Sales Amount])
當使用者將 TotalSales 量值放在報表中,然後將產品類別資料行從產品資料表放入 [篩選條件] 時,就會針對每個產品類別目錄計算並顯示銷售金額的總和。
不同於計算結果資料行,量值語法會包含公式前面的量值名稱。 在剛才提供的範例中,總銷售額的名稱會顯示在公式前面。 建立量值之後,名稱及其定義會出現在報表用戶端應用程式欄位清單中,且會根據檢視方塊和角色提供給模型的所有使用者。
若要深入了解,請參閱:
Power BI Desktop 中的量值
Analysis Services 中的量值
Power Pivot 中的量值
計算結果欄
計算結果欄是您新增至現有資料表的資料行 (在模型設計工具中),然後建立定義資料行值的 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[Country] = "USA"
銷售角色的成員只能查看美國客戶的資料,而彙總 (例如 SUM) 則只會針對美國的客戶傳回。 Excel 中的 Power Pivot 無法使用資料列層級安全性。
使用 DAX 公式來定義資料列層級安全性時,您會建立允許的資料列集。 這不會拒絕存取其他資料列;更確切地說,這些資料列不會當作允許的資料列集一部分傳回。 其他角色則可以允許存取 DAX 公式所排除的資料列。 如果使用者是另一個角色的成員,且該角色的資料列層級安全性允許存取該特定資料列集,則使用者可以查看該資料列的資料。
資料列層級安全性公式會套用至指定資料列和相關的資料列。 當資料表具有多個關聯性時,篩選條件會針對使用中的關聯性來套用安全性。 資料列層級安全性公式會與針對相關資料表定義的其他公式交集。
若要深入了解,請參閱:
Power BI 的資料列層級安全性 (RLS)
Analysis Services 的角色
查詢
也可以在 SQL Server Management Studio (SSMS) 和 DAX Studio (daxstudio.org) 等開放原始碼工具中建立及執行 DAX 查詢。 不同於 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] 的相同資料列中新增值,並將結果放在同一個資料列的計算結果欄中。 |
無論所建立的公式是簡單或複雜,您都可以在建立公式時使用下列步驟:
每個公式都必須以等號 (=) 開頭。
您可以鍵入或選取函式名稱,或鍵入運算式。
開始鍵入函式或所需名稱的前幾個字母,AutoComplete 會顯示可用函式、資料表和資料行的清單。 按 TAB 鍵,將項目從 AutoComplete 清單新增至公式。
您也可以按一下 [Fx] 按鈕以顯示可用的函式清單。 若要從下拉式清單中選取函式,請使用方向鍵來醒目提示該項目,然後按一下 [確定] 將函式新增至公式。
從可能的資料表和資料行下拉式清單中選取 (或鍵入值),以將引數提供給函式。
檢查語法錯誤:請確認所有括弧都已關閉,且正確地參考了資料行、資料表和值。
按 ENTER 以接受公式。
注意
在計算結果欄中,只要您輸入公式並驗證公式,資料行就會填入值。 在量值中,按 ENTER 會將量值定義與資料表一起儲存。 如果公式無效,則會顯示錯誤。
在此範例中,讓我們來看看名為 [目前季度中的天數] 量值中的公式:
Days in Current Quarter = COUNTROWS( DATESBETWEEN( 'Date'[Date], STARTOFQUARTER( LASTDATE('Date'[Date])), ENDOFQUARTER('Date'[Date])))
此量值用於在不完整期間和上一個期間之間建立比較比例。 公式必須考慮經過的期間比例,並與前一個期間的相同比例進行比較。 在此情況下,[目前季度至今的天數]/[目前季中的天數] 會提供目前期間內經過的比例。
此公式包含下列項目:
公式項目 | 說明 |
---|---|
Days in Current Quarter |
量值的名稱。 |
= |
等號 (=) 會開始公式。 |
COUNTROWS |
COUNTROWS 會計算日期資料表中的資料列數目 |
() |
左右括弧會指定引數。 |
DATESBETWEEN |
DATESBETWEEN 函式會傳回日期資料表中日期資料行中每個值最後一個日期之間的日期。 |
'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 中的日期和時間函式類似。 不過,DAX 函式是根據從 1900 年 3 月 1 日開始的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 中的資料類型 | 說明 |
---|---|---|
整數 | 64 位元 (八位元組) 整數值 1、2 | 沒有小數位數的數字。 整數可以是正數或負數,但必須是介於 -9,223,372,036,854,775,808 (-2^63) 和 9,223,372,036,854,775,807 (2^63-1) 之間的整數。 |
十進位數字 | 64 位元 (八位元組) 實數 1、2 | 實數是可以有小數位數的數字。 實數涵蓋範圍廣泛的值: 從 -1.79E +308 到 -2.23E -308 的負值 零 從 2.23E -308 到 1.79E + 308 的正值 不過,有效位數的數目限制為 17 個小數位數。 |
Boolean | Boolean | True 或 False 值。 |
Text | String | Unicode 字元資料字串。 可以是字串或數字,或以文字格式表示的日期。 |
Date | 日期時間 | 可接受日期時間表示法中的日期和時間。 有效日期為 1900 年 3 月 1 日之後的所有日期。 |
貨幣 | 貨幣 | 貨幣資料類型允許介於 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之間的值,並具有四個固定有效位數的十進位數。 |
N/A | Blank | 空白是 DAX 中表示和取代 SQL Null 的資料類型。 您可以使用 BLANK 函式來建立空白,並使用 ISBLANK 邏輯函式來測試空白。 |
表格式資料模型也包含「資料表」資料類型作為多個 DAX 函式的輸入或輸出。 例如,FILTER 函式會採用資料表作為輸入,並輸出另一個只包含符合篩選條件的資料列資料表。 您可以藉由結合資料表函式與彙總函式,對以動態方式定義的資料集執行複雜計算。
雖然資料類型通常會自動設定,但請務必了解資料類型,以及資料類型的套用方式 (尤其是對 DAX 公式)。 例如,公式或非預期結果中的錯誤,通常是使用無法與引數中所指定資料類型搭配使用的特定運算子所造成。 例如,公式 = 1 & 2
會傳回字串結果 12。 不過,公式 = "1" + "2"
會傳回整數結果 3。
上下文
「內容」是在建立 DAX 公式時要了解的重要概念。 內容可讓您執行動態分析,因為公式結果會變更以反映出目前的資料列或資料格選取,以及任何相關的資料。 了解內容並有效使用內容,對於建置高效能的動態分析、以及對公式中的問題進行疑難排解都非常重要。
視其他設計項目而定,可以在不同內容中評估表格式模型中的公式:
- 套用於樞紐分析表或報表中的篩選條件
- 在公式內定義的篩選條件
- 在公式內使用特殊函式所指定的關聯性
內容有不同的類型:「資料列內容」、「查詢內容」和「篩選內容」。
資料列內容
「資料列內容」可以視為「目前的資料列」。 如果您在計算結果欄中建立公式,則該公式的資料列內容,就會包含目前資料列中所有資料行的值。 如果資料表與另一個資料表相關,則內容也會包含在另一個資料表中與目前資料列相關的所有值。
例如,假設您建立計算結果欄 = [Freight] + [Tax]
,其將來自相同資料表的兩個資料行、運費和稅金相加。 此公式只會從指定資料行中的目前資料列自動取得值。
資料列內容也會遵循在資料表之間定義的任何關聯性,包括使用 DAX 公式在計算結果欄中定義的關聯性,以用於判斷相關資料表中哪些資料列與目前的資料列相關。
例如,下列公式會根據訂單的運送區域,使用相關函式來擷取相關資料表中的稅金值。 稅金值的確定方式是使用目前資料表中區域值、在相關資料表中查閱該區域,然後從相關資料表取得該區域的稅率。
= [Freight] + RELATED('Region'[TaxRate])
此公式會從區域資料表中取得目前區域的稅率,並將其新增至運費資料行的值。 在 DAX 公式中,您不需要知道或指定與資料表相連的特定關聯性。
多個資料列內容
DAX 包含對資料表進行反覆計算的函式。 這些函式可以具有多個目前的資料列,每個都有自己的資料列內容。 基本上,這些函式可讓您建立以遞迴方式執行內部和外部迴圈作業的公式。
例如,假設模型包含 [產品] 資料表和 [銷售] 資料表。 使用者可能會想要瀏覽整個銷售資料表 (此資料表是與多項產品相關的交易),並找出任何一筆交易中針對每個產品訂購的最大數量。
使用 DAX 時,您可以建置單一公式來傳回正確的值,每當使用者將資料新增至資料表時都會自動更新結果。
= MAXX(FILTER(Sales,[ProdKey] = EARLIER([ProdKey])),Sales[OrderQty])
如需此公式的詳細範例,請參閱 EARLIER。
總而言之,EARLIER 函式會從目前作業前面的作業中儲存資料列內容。 函式會隨時在記憶體中儲存兩組內容:一組內容代表公式內部迴圈的目前資料列,另一組內容代表公式外部迴圈的目前資料列。 DAX 會自動摘要兩個迴圈的值,讓您可以建立複雜的彙總。
查詢內容
「查詢內容」代表針對公式隱含擷取的資料子集。 例如,當使用者將量值或欄位放入報告中時,引擎會檢查資料列和資料行標頭、交叉分析篩選器和報告篩選條件來判斷內容。 然後,系統會針對模型資料執行必要的查詢,以取得正確的資料子集、進行公式所定義的計算,然後在報告中填入值。
因為內容會根據您放置公式的位置而變更,所以公式的結果也會變更。 例如,假設所建立公式會加總 [銷售] 資料表的 [收益] 資料行中值:= SUM('Sales'[Profit])
。 如果您在 [銷售] 資料表內的計算結果欄中使用此公式,則整個資料表的公式結果都相同,因為公式查詢內容一律是 [銷售] 資料表的整個資料集。 結果會具有所有區域、所有產品、所有年度等的利潤。
不過,使用者通常不會想要看到相同結果,而是想要取得特定年度、特定國家/地區、特定產品的收益,或這些當中的某種組合,然後取得總計。
在報告中,內容會藉由篩選、新增或移除欄位以及使用交叉分析篩選器來變更。 針對每個變更,在其中評估量值的查詢內容。 因此,用於量值中的相同公式會針對每個資料格在不同「查詢內容」中進行評估。
篩選內容
「篩選內容」是每個資料行中允許的一組值,或從相關資料表中擷取的值。 篩選條件可以套用至設計工具中的資料行,或在展示層 (報表和樞紐分析表) 中套用。 篩選條件也可以由公式內的篩選條件運算式來明確定義。
使用公式引數來指定資料行或資料表中所允許值集的篩選條件約束時,就會新增篩選內容。 篩選內容會套用至其他內容 (例如資料列內容或查詢內容) 之上。
在表格式模型中,有許多方式可以建立篩選內容。 在可以取用模型的用戶端內容 (例如 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_column 與 search_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 Desktop
Power BI Desktop 是免費的資料模型和報表應用程式。 模型設計工具包含用於建立 DAX 計算公式的 DAX 編輯器。
Excel 中的 Power Pivot
Excel 中的 Power Pivot 模型設計工具包含用於建立 DAX 計算公式的 DAX 編輯器。
Visual Studio
Visual Studio (具備 Analysis Services 專案延伸模組 (VSIX)) 會用來建立 Analysis Services 模型專案。 隨著專案延伸模組一起安裝的表格式模型設計師包含 DAX 編輯器。
SQL Server Management Studio
SQL Server Management Studio (SSMS) 是使用 Analysis Services 的基本工具。 SSMS 包含用於查詢表格式和多維度模型的 DAX 查詢編輯器。
DAX Studio
DAX Studio 是開放原始碼用戶端工具,其可用於針對 Excel 模型中的 Analysis Services、Power BI Desktop 和 Power Pivot 建立及執行 DAX 查詢。
Tabular Editor
表格式編輯器是一個開放原始碼工具,可提供表格式模型中繼資料中每個物件的直覺、階層式檢視。 表格式編輯器包含 DAX 編輯器,其中包含語法醒目提示,可讓您輕鬆編輯量值、計算結果欄與計算資料表運算式。
學習資源
學習 DAX 時,最好是使用您將用於建立資料模型的應用程式。 Analysis Services、Power BI Desktop 和 Excel 中的 Power Pivot 都有文章和教學課程,其中包含使用 DAX 建立量值、匯出資料行和資料列篩選的課程。 以下是一些額外資源:
在 Power BI Desktop 中使用 DAX 學習路徑。
Alberto Ferrari 和 Marco Russo 的 DAX 最終指南 (Microsoft Press)。 現在在其第二個版本中,這份全面性的指南提供資料建模新手和 BI 專業人員在高效能技術上創新的基本概念。
社群
DAX 擁有充滿活力的社群,一向願意分享其專業知識。 Microsoft Power BI 社群 有適用於 DAX 的特殊討論論壇,DAX 命令和祕訣。