共用方式為


表格式模型中的DAX

適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

數據分析表達式 (DAX) 是一種公式語言,可用來在 Excel 中的 Analysis Services、Power BI 和 Power Pivot 中建立自定義計算。 DAX 公式包括函數、運算元和值,以對數據表和數據行中的數據執行進階計算。

雖然 DAX 用於 Excel 中的 Analysis Services、Power BI 和 Power Pivot,但本文適用於在 Visual Studio 中撰寫的 Analysis Services 表格式模型專案。

匯出數據行、匯出數據表、量值和數據列篩選中的DAX公式

對於表格式模型,DAX 公式會用於匯出數據行、量值和數據列篩選。

匯出數據行

匯出數據行是您新增至現有數據表的數據行(在模型設計工具中),然後建立定義數據行值的 DAX 公式。

注意

使用 DirectQuery 模式從關係型數據源擷取數據的模型不支援導出數據行。

當計算結果列包含有效的 DAX 公式時,只要輸入公式,就會針對每個數據列計算值。 然後,值會儲存在資料庫中。 例如,在 Date 數據表中,當公式 =[Calendar Year] & " Q" & [Calendar Quarter] 輸入公式列時,數據表中每個數據列的值都是藉由從 [行事歷年] 數據行(在相同的 Date 數據表中)、新增空格和大寫字母 Q 來計算,然後從 [行事歷季] 數據行(在同一個 Date 數據表中)新增值。 計算結果列中每個資料列的結果會立即計算,例如,2010 年第 1 季。 只有在重新處理數據時,才會重新計算數據行值。

若要深入瞭解,請參閱 匯出資料行

匯出數據表

計算數據表是以 DAX 查詢或表示式為基礎,衍生自相同模型中所有或部分其他數據表的計算物件。

若要深入瞭解,請參閱 匯出數據表

措施

量值是動態公式,結果會根據內容而變更。 量值用於支持結合和篩選模型數據的報告格式,方法是使用多個屬性,例如 Power BI 報表或 Excel 數據透視表或樞紐分析圖。 量值是由模型作者定義,方法是在 Visual Studio 的模型設計工具中使用量值方格(和公式列)。

量值中的公式可以使用自動收集功能自動建立的標準聚合函數,例如 COUNT 或 SUM,或者您可以使用 DAX 來定義自己的公式。 當您在公式列中定義量值的公式時,工具提示功能會顯示目前內容中總計結果的預覽,否則結果不會立即輸出到任何地方。 其他量值詳細數據也會出現在 [屬性] 窗格中。

您無法立即看到計算的(已篩選)結果的原因是無法判斷量值的結果,而不需要內容。 若要評估量值,需要報表用戶端應用程式,以提供擷取每個數據格相關數據所需的內容,然後評估每個數據格的表達式。 該用戶端可能是 Excel 數據透視表或樞紐分析圖、Power BI 報表或 MDX 查詢。 不論報表客戶端為何,都會針對結果中的每個數據格執行個別查詢。 也就是說,數據透視表中每個數據列和數據行標頭的組合,或 Power BI 報表中交叉分析篩選器和篩選的每個選取專案,都會產生計算量值的不同數據子集。 例如,在具有公式的量值中,Total Sales:=SUM([Sales Amount]),當使用者將 TotalSales 量值放在數據透視表中的 [值] 視窗中,然後將 DimProductCategory 數據表中的 DimProductCategory 數據行放入 [篩選] 視窗中時,會計算並顯示每個產品類別的 Sales Amount 總和。

與計算結果列和數據列篩選不同,量值的語法包含公式前面的量值名稱。 在剛才提供的範例中,總銷售額 名稱: 出現在公式前面。 建立量值之後,名稱及其定義會出現在報表用戶端應用程式欄位清單中,並視檢視方塊和角色而定,可供模型的所有使用者使用。

若要深入瞭解,請參閱 量值

數據列篩選

數據列篩選會定義特定角色成員可以看到數據表中的數據列。 您可以使用 DAX 公式,為模型中的每個數據表建立數據列篩選。 數據列篩選條件是在 Visual Studio 中使用角色管理員建立的特定角色。 您也可以使用 SQL Server Management Studio 中的角色屬性,為已部署的模型定義數據列篩選條件。

在數據列篩選中,必須評估為布爾值 TRUE/FALSE 條件的 DAX 公式會定義該特定角色成員查詢結果可以傳回哪些數據列。 DAX 公式中未包含的數據列無法傳回。 例如,對於 Sales 角色的成員,具有下列 DAX 公式的 Customers 數據表 =Customers[Country] = "USA",銷售角色的成員只能檢視美國客戶的數據,而匯總,例如 SUM 只會針對美國的客戶傳回。

當您使用 DAX 公式定義資料列篩選時,您會建立允許的數據列集。 這不會拒絕存取其他數據列;相反地,它們不會當做允許數據列集的一部分傳回。 其他角色可以允許存取 DAX 公式排除的數據列。 如果使用者是另一個角色的成員,而且該角色的數據列篩選允許存取該特定數據列集,則使用者可以檢視該數據列的數據。

數據列篩選會套用至指定的數據列,以及相關的數據列。 當數據表有多個關聯性時,篩選會套用作用中關聯性的安全性。 數據列篩選會與針對相關數據表定義的其他數據列篩選進行交集。

若要深入瞭解,請參閱 角色

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 到 1.79E + 308 的正值 -308

不過,有效位數限製為17個十進位數。
布爾 布爾 True 或 False 值。
發簡訊 字串 Unicode 字元數據字串。 可以是以文字格式表示的字串、數位或日期。
日期 日期/時間 接受日期時間表示中的日期和時間。

有效日期都是 1900 年 3 月 1 日之後的所有日期。
貨幣 貨幣 貨幣數據類型允許介於 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之間的值,具有四個固定精確度的小數位數。
N/A 空白 空白是 DAX 中的數據類型,代表和取代 SQL Null。 您可以使用 BLANK 函式建立空白,並使用邏輯函式 ISBLANK 測試空白。

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

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

如需表格式模型中數據類型的詳細資訊,以及 DAX 中數據類型的明確和隱含轉換,請參閱支援的數據類型

DAX 運算元

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

  • 比較運算符可比較值,並傳回邏輯 TRUE\FALSE 值。
  • 算術運算符來執行傳回數值的算術計算。
  • 要聯結兩個或多個文字字串的文字串連運算符。
  • 結合兩個或多個表達式以傳回單一結果的邏輯運算符。

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

DAX 公式

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

公式基本概念

DAX 可讓表格式模型作者在兩個模型數據表中定義自定義計算,做為匯出數據行的一部分,以及做為與數據表相關聯的量值,但不直接出現在其中。 DAX 也可讓模型作者藉由建立可傳回布爾值的計算來保護數據,以定義關聯角色的成員用戶可查詢特定或相關數據表中的數據列。

DAX 公式可能非常簡單或相當複雜。 下表顯示一些可用於匯出數據行的簡單公式範例。

公式 描述
=TODAY() 在數據行的每個數據列中插入今天的日期。
=3 在數據列的每個數據列中插入值 3。
=[Column1] + [Column2] 在 [Column1] 和 [Column2] 的相同數據列中加入值,並將結果放入相同數據列的匯出數據行中。

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

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

  2. 您可以輸入或選取函式名稱,或輸入表示式。

  3. 開始輸入您想要的函式或名稱的前幾個字母,而 AutoComplete 會顯示可用的函式、資料表和數據行清單。 按 TAB 鍵,將專案從 [自動完成] 列表新增至公式。

    您也可以按下 [Fx] 按鈕,以顯示可用的函式清單。 若要從下拉式清單中選取函式,請使用箭頭鍵反白顯示專案,然後按兩下 [確定] [確定] 將函式新增至公式。

  4. 從可能數據表和數據行的下拉式清單中選取自變數給函式,或輸入值來提供自變數。

  5. 檢查語法錯誤:確定所有括號都已關閉,而且會正確參考數據表和值。

  6. 按 ENTER 以接受公式。

注意

在匯出數據行中,只要您輸入公式並驗證公式,數據行就會填入值。 在量值中,按 ENTER 會將量值定義儲存在量值方格與數據表中。 如果公式無效,則會顯示錯誤。

在此範例中,我們會在名為 Days in Current Quarter 的量值中查看更複雜的公式:

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

此量值是用來建立不完整期間與前一個期間之間的比較比率。 公式必須考慮經過的期間比例,並將它與上一個期間中的相同比例進行比較。 在此情況下,[目前季度的日期]/[本季中的天數] 會提供目前期間所耗用的比例。

此公式包含下列元素:

Formula 元素 描述
Days in Current Quarter:= 量值的名稱。
= 等號 (=) 會開始公式。
COUNTROWS COUNTROWS 函數會計算 Date 資料表中的數據列數目
() 開啟和結尾括弧會指定自變數。
DATESBETWEEN DATESBETWEEN 函式會傳回 Date 資料表中 Date 數據行中每個值最後一個日期之間的日期。
'Date' 指定 Date 資料表。 數據表以單引號表示。
[Date] 指定 Date 資料表中的 Date 資料行。 數據行以方括弧括住。
,
STARTOFQUARTER STARTOFQUARTER 函式會傳回季開始的日期。
LASTDATE LASTDATE 函式會傳回季的最後一個日期。
'Date' 指定 Date 資料表。
[Date] 指定 Date 資料表中的 Date 資料行。
,
ENDOFQUARTER ENDOFQUARTER 函式
'Date' 指定 Date 資料表。
[Date] 指定 Date 資料表中的 Date 資料行。

使用公式自動完成

模型設計工具中的公式列和 [角色管理員] 對話方塊中的 [資料列篩選] 視窗都會提供自動完成功能。 AutoComplete 提供公式中每個元素的選項,協助您輸入有效的公式語法。

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

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

在公式中使用多個函式

您可以巢狀函式,這表示您可以使用某個函式的結果作為另一個函式的自變數。 您可以在匯出資料行中巢狀最多 64 層的函式。 不過,巢狀結構可能會讓您難以建立或疑難解答公式。

許多函式都是設計成只能當做巢狀函式使用。 這些函式會傳回無法直接儲存為結果的數據表;它必須做為數據表函式的輸入提供。 例如,SUMX、AVERAGEX 和 MINX 函式都需要數據表做為第一個自變數。

注意

某些限制會套用在函式巢狀的量值內,以確保效能不會受到數據行之間相依性所需的許多計算所影響。

DAX 函式

本節提供DAX所支援函式 類型的概觀。 如需詳細資訊,請參閱 DAX 函式參考

DAX 提供各種函式,您可以使用日期和時間執行計算、建立條件值、使用字串、根據關聯性執行查閱,以及逐一查看數據表以執行遞歸計算的能力。 如果您熟悉 Excel 公式,其中許多函式看起來會非常類似;不過,DAX 公式在下列重要方面有所不同:

  • DAX 函式一律會參考完整的數據行或數據表。 如果您想要只使用資料表或數據行中的特定值,您可以將篩選新增至公式。

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

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

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

日期和時間函式

DAX 中的日期和時間函式類似於 Microsoft Excel 中的日期和時間函式。 不過,DAX 函式是以 Microsoft SQL Server 所使用的 datetime 資料類型為基礎。 若要深入瞭解,請參閱 日期和時間函式 (DAX)

篩選函式

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

資訊函式

資訊函式會查看提供做為自變數的儲存格或數據列,並告訴您值是否符合預期的類型。 例如,如果您參考的值包含錯誤,ISERROR 函式會傳回 TRUE。 若要深入瞭解,請參閱 Information Functions (DAX)

邏輯函式

邏輯函式會根據表達式採取行動,以傳回表達式中值的相關信息。 例如,TRUE 函式可讓您知道您要評估的表達式是否傳回 TRUE 值。 若要深入瞭解,請參閱 邏輯函式 (DAX)

數學和三角函數

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

其他函式

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

統計函數

DAX 提供執行匯總的統計函數。 除了建立加總和平均值,或在 DAX 中尋找最小值和最大值,您也可以先篩選數據行,再根據相關數據表匯總或建立匯總。 若要深入瞭解,請參閱 統計函數 (DAX)

文字函式

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

時間智慧函式

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

數據表值函式

有 DAX 函式會輸出資料表、接受數據表做為輸入,或執行兩者。 因為數據表可以有單一數據行,因此數據表值函式也會接受單一數據行作為輸入。 瞭解如何使用這些數據表值函式對於充分利用DAX公式很重要。 DAX 包含下列類型的數據表值函式:

篩選函式 - 傳回與目前數據列相關的數據行、數據表或值。

聚合函數 - 匯總數據表數據列上的任何運算式。

時間智慧函式 - 傳回日期數據表,或使用日期數據表來計算匯總。

DAX 公式中的內容

Context 是使用 DAX 建立公式時要瞭解的重要概念。 內容可讓您執行動態分析,因為公式的結果會變更以反映目前的數據列或儲存格選取範圍,以及任何相關的數據。 有效地了解內容和使用內容對於建置高效能、動態分析,以及針對公式中的問題進行疑難解答至關重要。

表格式模型中的公式可以在不同的內容中評估,視其他設計元素而定:

  • 在數據透視表或報表中套用的篩選條件

  • 公式內定義的篩選

  • 在公式中使用特殊函式指定的關聯性

有不同類型的內容:數據列內容查詢內容,以及 篩選內容

數據列內容

數據列內容 可以視為「目前數據列」。 如果您在匯出數據行中建立公式,該公式的數據列內容會包含目前數據列中所有數據行的值。 如果數據表與另一個數據表相關,內容也會包含與目前數據列相關之其他數據表的所有值。

例如,假設您建立計算結果列 =[Freight] + [Tax],從同一個數據表新增兩個數據行 [貨運] 和 [稅金] 的值。 此公式會自動從指定數據列中的目前數據列取得值。

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

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

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

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

多個數據列內容

DAX 包含逐一查看數據表計算的函式。 這些函式可以有多個目前的數據列,每個數據列都有自己的數據列內容。 基本上,這些函式可讓您建立公式,以遞歸方式在內部和外部迴圈上執行作業。

例如,假設您的模型包含 Products 數據表和 Sales 數據表。 使用者可能會想要流覽整個銷售數據表,其中包含涉及多個產品的交易,並在任何一筆交易中尋找每個產品訂購的最大數量。

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

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

如需此公式的詳細逐步解說,請參閱 EARLIER 函式 (DAX)

為了摘要說明,EARLIER 函式會儲存目前作業之前之作業的數據列內容。 函式隨時都會儲存在記憶體中兩組內容:一組內容代表公式內部迴圈的目前數據列,另一組內容代表公式外部迴圈的目前數據列。 DAX 會自動在兩個循環之間摘要值,讓您可以建立複雜的匯總。

查詢內容

查詢內容 是指為公式隱含擷取的數據子集。 當使用者將量值或其他值欄位放入數據透視表或以表格式模型為基礎的報表時,引擎會檢查數據列和數據行標頭、交叉分析篩選器和報表篩選以判斷內容。 然後,針對數據源執行必要的查詢以取得正確的數據子集、進行公式定義的計算,然後填入數據透視表或報表中的每個數據格。 所擷取的數據集是每個數據格的查詢內容。

警告

針對 DirectQuery 模式中的模型,會評估內容,然後評估設定作業以擷取正確的數據子集並計算結果會轉譯為 SQL 語句。 然後,這些語句會直接針對關係型數據存放區執行。 因此,雖然取得數據和計算結果的方法不同,但內容本身不會變更。

因為內容會根據您放置公式的位置而變更,因此公式的結果也可以變更。

例如,假設您建立公式,以加總 Sales 資料表 Profit 資料行中的值:=SUM('Sales'[Profit])。 如果您在 Sales 數據表內的匯出數據行中使用此公式,則整個數據表的公式結果會相同,因為公式的查詢內容一律是 sales 數據表 整個數據集。 結果對所有區域、所有產品、所有年份等都有利潤。

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

在數據透視表中,新增或移除數據行和數據列標頭,以及新增或移除交叉分析篩選器,即可變更內容。 每當使用者將數據行或數據列標題新增至數據透視表時,就會變更評估量值的查詢內容。 配量和篩選作業也會影響內容。 因此,在量值中使用的相同公式會在每個數據格的不同 查詢內容中評估

篩選內容

篩選內容 是每個數據行或從相關數據表擷取的值集合。 篩選可以套用至設計工具中的數據行,或在呈現層中套用(報表和數據透視表)。 篩選也可以透過公式內的篩選表達式明確定義。

當您使用公式的自變數,在數據行或數據表中允許的值集上指定篩選條件約束時,就會加入篩選內容。 篩選內容會套用至其他內容,例如數據列內容或查詢內容。

在表格式模型中,有許多方式可以建立篩選內容。 在可取用模型之用戶端的內容中,例如 Power BI 報表,用戶可以在數據列和數據行標題上新增交叉分析篩選器或報表篩選,以即時建立篩選。 您也可以直接在公式內指定篩選表達式、指定相關值、篩選做為輸入的數據表,或動態取得計算中所用值的內容。 您也可以完全清除或選擇性地清除特定數據行上的篩選。 建立計算總計的公式時,這非常有用。

若要深入瞭解如何在公式內建立篩選,請參閱 FILTER 函式 (DAX)

如需如何清除篩選以建立總計的範例,請參閱 ALL 函式 (DAX)

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

判斷公式中的內容

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

驗證期間的內容(和重新計算作業)是依照上述各節所述,方法是使用模型中的可用數據表、數據表之間的任何關聯性,以及已套用的任何篩選。

例如,如果您剛將一些數據匯入新的數據表,而且它與任何其他數據表無關(而且您尚未套用任何篩選條件),則 目前的內容 是數據表中的整組數據行。 如果數據表依關聯性連結到其他數據表,則目前的內容會包含相關的數據表。 如果您將數據表中的數據行新增至具有交叉分析篩選器的報表,或某些報表篩選條件,公式的內容就是報表中每個數據格中的數據子集。

內容是一個功能強大的概念,也可讓您難以針對公式進行疑難解答。 建議您從簡單的公式和關聯性開始,以瞭解內容的運作方式。 下一節提供公式如何使用不同類型的內容來動態傳回結果的一些範例。

公式中內容的範例

RELATED 函式 (DAX) 函式會展開目前數據列的內容,以在相關數據行中包含值。 這可讓您執行查閱。 本文中的範例說明篩選和數據列內容的互動。

FILTER 函式 (DAX) 函式可讓您指定要包含在目前內容中的數據列。 本文中的範例也會說明如何在執行匯總的其他函式中內嵌篩選。

ALL 函式 (DAX) 函式會設定公式內的內容。 您可以使用它來覆寫查詢內容所套用的篩選。

ALLEXCEPT 函式 (DAX) 函式可讓您移除除了您指定的篩選以外的所有篩選。 這兩篇文章都包含逐步引導您建置公式和瞭解複雜內容的範例。

EARLIER 函式 (DAX)EARLIEST 函式 (DAX) 函式可讓您執行計算來迴圈執行數據表,同時參考內部迴圈中的值。 如果您熟悉遞歸的概念,以及內部和外部迴圈,您將瞭解EARLIER和EARLIEST函式所提供的功能。 如果您不熟悉這些概念,您應該仔細遵循範例中的步驟,查看計算中的內部和外部內容如何使用。

公式和表格式模型

Visual Studio 中的模型設計工具是一個區域,您可以在其中處理多個數據表,並連接表格式模型中的數據表。 在此模型中,數據表會以具有通用值的數據行關聯性聯結(索引鍵)。 表格式模型可讓您將值連結至其他數據表中的數據行,並建立更有趣的計算。 就像在關係資料庫中一樣,您可以連接許多相關數據表層級,並使用結果中任何數據表的數據行。

例如,您可以連結銷售數據表、產品數據表和產品類別數據表,而使用者可以在數據透視表和報表中使用各種數據行群組。 相關欄位可用來篩選連接的數據表,或建立子集的計算。 (如果您不熟悉關係資料庫和使用數據表和聯結,請參閱 關聯性

表格式模型支持數據表之間的多個關聯性。 為了避免混淆或錯誤的結果,一次只有一個關聯性指定為作用中關聯性,但您可以視需要變更作用中關聯性,以在計算中周遊數據中的不同連線。 USERELATIONSHIP 函式 (DAX) 可用來指定要在特定計算中使用的一或多個關聯性。

在表格式模型中,您應該觀察這些公式設計規則:

  • 當資料表透過關聯性連接時,您必須確定當做索引鍵使用的兩個數據行具有相符的值。 不過,不會強制執行引用完整性;因此,在索引鍵數據行中可能會有不相符的值,而且仍然建立關聯性。 如果發生這種情況,您應該知道空白值或不符合的值可能會影響公式的結果。

  • 當您使用關聯性連結模型中的數據表時,您可以放大範圍,或 內容,在其中評估公式。 新增數據表、新關聯性或作用中關聯性變更所產生的內容變更,可能會導致結果以您可能不會預期的方式變更。 若要深入瞭解,請參閱本文稍早的 DAX 公式內容。

使用數據表和數據行

表格式模型中的數據表看起來就像 Excel 數據表,但使用數據和公式的方式不同:

  • 公式只適用於數據表和數據行,不適用於個別儲存格、範圍參考或陣列。

  • 公式可以使用關聯性從相關數據表取得值。 所擷取的值一律與目前數據列值相關。

  • 您無法有不規則或「不規則」的數據,就像在Excel工作表中一樣。 數據表中的每個數據列都必須包含相同數目的數據行。 不過,在某些數據行中,您可以有空白值。 Excel 數據表和表格式模型數據表無法互換。

  • 因為針對每個數據行設定數據類型,因此該數據行中的每個值都必須是相同的類型。

參照公式中的數據表和數據行

您可以使用其名稱來參考任何資料表和資料列。 例如,下列公式說明如何使用 完整 名稱,從兩個數據表參考數據行:

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

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

數據表關聯性

藉由建立數據表之間的關聯性,您就能夠查閱另一個數據表中的數據,並使用相關值來執行複雜的計算。 例如,您可以使用計算結果列來查閱與目前轉銷商相關的所有出貨記錄,然後為每個轉銷商加總出貨成本。 不過,在許多情況下,可能不需要關聯性。 您可以在公式中使用 LOOKUPVALUE 函數,針對符合 search_columnsearch_value 參數中所指定準則的數據列,傳回 result_columnName 中的值。

許多 DAX 函式要求數據表之間或多個數據表之間存在關聯性,才能找出您參考的數據行,並傳回有意義的結果。 其他函式會嘗試識別關聯性;不過,為了獲得最佳結果,您應該一律盡可能建立關聯性。 若要深入瞭解,請參閱本文稍早的公式和表格式模型。

更新公式的結果(行程)

數據處理重新計算 是兩個不同的相關作業。 設計包含複雜公式、大量數據或從外部數據源取得的數據時,您應該徹底瞭解這些概念。

處理數據 是使用外部數據源新數據更新模型中數據的程式。

重新計算 是更新公式結果的程式,以反映公式本身的任何變更,以及反映基礎數據中的變更。 重新計算可能會以下列方式影響效能:

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

  • 每當使用者將量值加入數據透視表或開啟報表時,都會動態評估量值所計算的值:當使用者修改內容時,量值會變更傳回的值。 量值的結果一律會反映記憶體內部快取中的最新結果。

除非重新計算的結果傳回不同的值,否則處理和重新計算對數據列篩選公式沒有任何影響,因此讓數據列可由角色成員查詢或無法查詢。

針對公式中的錯誤進行疑難解答

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

語法錯誤是最簡單的解決方式。 它們通常牽涉到遺漏的括號或逗號。 如需個別函式語法的說明,請參閱 DAX 函式參考

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

  • 公式是指非現有的數據行、數據表或函式。

  • 公式看起來正確,但當數據引擎擷取其發現類型不符的數據時,並引發錯誤。

  • 公式會將不正確的參數數目或類型傳遞給函式。

  • 公式會參考發生錯誤的不同數據行,因此其值無效。

  • 公式是指尚未處理的數據行,這表示其具有元數據,但沒有實際數據用於計算。

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

另請參閱

數據分析表示式 (DAX) 參考
量值
匯出數據行
角色
KPI
支援的數據源