閱讀英文

共用方式為


DAX 查詢

每當視覺效果在報表中顯示或新增至數據表的欄位時,Power BI 和 Excel 等報表用戶端都會執行 DAX 查詢,而且這些 DAX 查詢會在套用篩選時調整。 Power BI Desktop 中的 效能分析器 可以顯示這些 DAX 查詢,甚至在 DAX 查詢檢視中執行它們。

藉由在Power BI Desktop 中使用 DAX 查詢檢視,或在Power BI 服務中 撰寫 DAX 查詢,即可建立並執行自己的 DAX 查詢。 透過 Microsoft Fabric,您可以使用 Copilot 來進一步提升生產力,在桌面或 Web 的 DAX 查詢檢視中撰寫 DAX 查詢。 其他工具,例如 SQL Server Management Studio (SSMS)、Power BI 報表產生器,以及 DAX Studio等開放原始碼工具,也可讓您建立和執行 DAX 查詢。

DAX 查詢會在工具內以數據表的形式傳回結果,讓您能夠在量值中快速建立及測試 DAX 公式的效能,或只是檢視語意模型中的數據。 INFO 和 INFO.VIEW DAX 函數也可以取得語意模型的相關資訊,例如表格、欄、度量值等的清單。

在學習查詢之前,重要的是要對 DAX 的基本概念有扎實的理解。 如果您尚未這麼做,請務必查看 DAX 總覽

關鍵字

DAX 查詢的簡單語法只包含一個必要的關鍵詞 EVALUATE。 EVALUATE 後面要接一個數據表運算式,例如 DAX 函數或數據表名稱,執行後將輸出結果數據表。 包括輸出結果資料表的資料表運算式有:

  1. 輸出數據表的常見 DAX 函式, 例如 SUMMARIZESUMMARIZECOLUMNSSELECTCOLUMNSFILTERUNIONTOPNADDCOLUMNSDATATABLE等等,都會使用 EVALUATE 來輸出結果數據表。
  2. 在模型中,依名稱參考的表格會與EVALUATE一起使用,來輸出顯示表格數據的結果表。 例如,EVALUATE 'Table name' 可以當做 DAX 查詢執行。
  3. 模型或任何 DAX 公式中的量度,當傳回純量值且被大括號括住時,使用 EVALUATE 來以結果表形式顯示該值。 例如,EVALUATE {[Total Sales]}EVALUATE {COUNTROWS('Sales')} 可以當做 DAX 查詢執行。 這些稱為 資料表建構函式

DAX 查詢有數個特定的可選關鍵詞:ORDER BY、START AT、DEFINE、MEASURE、VAR、TABLE 和 COLUMN。

EVALUATE (必要)

在最基本的層級,DAX 查詢是包含數據表表達式的 EVALUATE 語句。 不過,至少需要一個 EVALUATE 陳述式,但是查詢可以包含任意數目的 EVALUATE 陳述式。

EVALUATE 語法

EVALUATE <table>  

EVALUATE 參數

詞彙 [定義]
table 資料表運算式。

EVALUATE 範例

EVALUATE
	'Sales Order'

傳回 Sales Order 資料表中的所有數據列和數據行,做為結果數據表。 這可以透過使用 TOPNFILTER來限制,並透過使用 ORDER BY 來排序。

螢幕快照,顯示如何在Power BI Desktop的DAX查詢檢視中使用EVALUATE進行DAX查詢。

ORDER BY (選擇性)

選擇性 ORDER BY 關鍵詞會在用來排序查詢結果的查詢或表達式中定義一或多個數據行。 結果中每個資料列任何可求解的運算式皆有效。 查詢本身中的任何欄也是有效的。

語意模型中的按列屬性排序方式不適用於 DAX 查詢結果。 如果一個欄位需要按模型中的另一個欄排序,例如月份名稱的情況,則排序依據的欄位也應該包含在用於 ORDER BY 的 DAX 查詢中。

ORDER BY 語法

EVALUATE <table>  
[ORDER BY {<expression> [{ASC | DESC}]}[, …]]  

ORDER BY 參數

詞彙 [定義]
expression 任何會傳回單一純量值的DAX表達式,或在DAX查詢中包含的數據行。
ASC (預設) 遞增排序次序。
DESC 遞減排序次序。

ORDER BY 範例

EVALUATE
	SUMMARIZECOLUMNS(
		// Group by columns
		'Date'[Month Name],
		'Date'[Month of Year],
		'Product'[Category],

		// Optional filters
		FILTER(
			VALUES('Product'[Category]),
			[Category] = "Clothing"
		),

		// Measures or explicit DAX formulas to aggregate and analyze the data by row
		"Orders", [Orders],
		"Avg Profit per Order", DIVIDE(
			[Total Sales Profit],
			[Orders]
		)
	)

	// DAX queries do not use sort order defined in Power BI, 
	// sort by columns must be included in the DAX query to be used in order by
	ORDER BY 'Date'[Month of Year] ASC

依月份遞增順序傳回服裝訂單和以每個訂單計算的平均利潤,並組成一個結果數據表。

螢幕快照,顯示如何在Power BI Desktop的DAX查詢檢視中使用ORDER BY進行DAX查詢。

TOPN 不會根據 ORDER BY 中指定的排序順序,選擇要傳回的指定數據列數目。 相反地,TOPN 有自己的語法,可選擇在傳回前 100 個數據列之前指定排序。 ORDER BY 只會排序 TOPN 傳回的結果數據表。

EVALUATE
	TOPN(
		100,
		'Sales Order',
		// The way the data is sorted before the top 100 rows are selected
		'Sales Order'[SalesOrderLineKey], ASC
	)
	// The way the data is sorted for the results
	ORDER BY
		'Sales Order'[Sales Order] ASC,
		'Sales Order'[Sales Order Line] ASC

會傳回依 SalesOrderLienKey 遞增排序的前 100 筆銷售訂單,然後先根據銷售訂單對結果排序,再根據銷售訂單行對結果排序。

螢幕快照,顯示如何在Power BI Desktop的DAX查詢檢視中使用 TOPN 和ORDER BY進行DAX查詢。

START AT (選擇性)

選擇性 START AT 關鍵詞會在 ORDER BY 子句內使用。 定義查詢結果開始的值。

START AT 語法

EVALUATE <table>  
[ORDER BY {<expression> [{ASC | DESC}]}[, …]  
[START AT {<value>|<parameter>} [, …]]]

START AT 參數

詞彙 [定義]
value 常數值。 不能是運算式。
parameter XMLA 陳述式中以 @ 字元為前置詞的參數名稱。

START AT 備註

START AT 引數與 ORDER BY 子句中的資料行有一對一對應關係。 START AT 子句中的引數數量可以和 ORDER BY 子句一樣,但不能超過。 START AT 的第一個引數會定義 ORDER BY 資料行的資料行 1 起始值。 START AT 的第二個引數會定義 ORDER BY 資料行中,資料列中符合資料行 1 第一個值的資料行 2 起始值。

START AT 範例

EVALUATE
	'Sales Order'
	ORDER BY 'Sales Order'[Sales Order] ASC
	// Start at this order, orders before this order will not be displayed
	START AT "SO43661"

從 Sales Order 表格中傳回所有欄位,依 Sales Order 遞增排序,從 SO43661 開始。 此銷售訂單之前的數據列不會包含在結果數據表中。

螢幕快照,顯示如何在Power BI Desktop的DAX查詢檢視中使用ORDER BY和 START AT 進行DAX查詢。

DEFINE (選擇性)

選擇性的 DEFINE 關鍵詞引入了一個或多個計算的實體定義,這些定義僅在查詢期間存在。 與 EVALUATE不同,DAX 查詢中只能有一個 DEFINE 區塊與一或多個定義。 DEFINE 必須在第一個 EVALUATE 語句之前,而且對查詢中的所有EVALUATE 語句都有效。 定義可以是變數、量值、資料表1 和資料行1。 定義可以參考出現在目前定義前後的其他定義。 如果查詢中包含 DEFINE 關鍵詞,則至少需要一個定義。

DEFINE MEASURE 是建置新量值或編輯語意模型中現有量值的常見案例。 當量值已存在於模型中時,DAX 查詢會使用查詢中定義的量值 DAX 公式。 這有助於在更新模型之前,先測試 DAX 查詢的量值。

DEFINE MEASURE 也有助於使用 DAX 公式來為特定的 DAX 查詢進行額外的分析,適用於您可能沒有加入模型量值的許可權或者不必要將其納入模型的情況。

DEFINE 語法

[DEFINE 
    (
     (MEASURE <table name>[<measure name>] = <scalar expression>) | 
     (VAR <var name> = <table or scalar expression>) |
     (TABLE <table name> = <table expression>) | 
     (COLUMN <table name>[<column name>] = <scalar expression>) | 
    ) + 
]

(EVALUATE <table expression>) +

DEFINE 參數

詞彙 [定義]
Entity MEASURE、VAR、TABLE1,或 COLUMN1
name 量值、var、資料表或資料行定義的名稱。 不能是運算式。 此名稱不需要是唯一的。 名稱只會在查詢期間存在。
expression 傳回資料表或純量值的任何 DAX 運算式。 運算式可以使用任何已定義的實體。 如果需要將純量運算式轉換成資料表運算式,請將運算式包裝在具有大括弧 {} 的資料表建構函式內,或使用 ROW() 函式傳回單一資料列資料表。

[1]注意:查詢範圍 TABLE 和 COLUMN 定義都僅供內部使用。 雖然您可以針對沒有語法錯誤的查詢定義 TABLE 和 COLUMN 運算式,但其可能會產生執行階段錯誤,所以不建議這麼做。

DEFINE 備註

  • DAX 查詢可以有多個 EVALUATE 陳述式,但只能有一個 DEFINE 陳述式。 DEFINE 陳述式中的定義可以套用至查詢中的任何 EVALUATE 陳述式。

  • DEFINE 陳述式中至少需要一個定義。

  • 查詢覆寫模型量值的量值定義,其名稱相同,但是僅在查詢內使用。 它們不會影響模型量值。

  • VAR 名稱具有唯一的限制。 若要深入了解,請參閱 VAR - 參數

DEFINE 範例

DEFINE
	VAR _firstyear = MIN('Date'[Fiscal Year])
	VAR _lastyear = MAX('Date'[Fiscal Year])
	TABLE 'Unbought products' = FILTER('Product', [Orders] + 0 = 0)
	COLUMN 'Unbought products'[Year Range] = _firstyear & " - " & _lastyear
	MEASURE 'Unbought products'[Unbought products] = COUNTROWS('Unbought products')
	
EVALUATE
	'Unbought products'
	
EVALUATE
	{[Unbought products]}

傳回在 DAX 查詢中定義的數據表,顯示未購買的產品,以及一個參照已定義變數的附加數據欄。 會定義並評估一個用於計算未購買產品行數的措施。

螢幕快照,顯示如何在Power BI Desktop的DAX查詢檢視中使用DEFINE進行DAX查詢。

DEFINE
	MEASURE 'Pick a sales measure'[Orders] = DISTINCTCOUNT('Sales Order'[Sales Order])
	MEASURE 'Pick a sales measure'[Customers] = CALCULATE(
			COUNTROWS(Customer),
			FILTER(
				'Sales',
				[Orders] > 0
			)
		)
	MEASURE 'Pick a sales measure'[Orders per Customer] = DIVIDE(
			[Orders],
			[Customers],
			0
		)

EVALUATE
	SUMMARIZECOLUMNS(
		'Date'[Fiscal Year],
		"Orders", [Orders],
		"Customers", [Customers],
		"Orders per Customer", [Orders per Customer]
	)

傳回一個數據表,評估三個已定義的量值,以依會計年度顯示結果。 模型中也存在所有量值,而且 DAX 查詢中會修改每個客戶的訂單。

螢幕快照顯示如何在 Power BI Desktop 的 DAX 查詢檢視中使用 DEFINE MEASURE 來進行 DAX 查詢。

DAX 查詢中的參數

正確定義的 DAX 查詢陳述式可以參數化,只需變更參數值即可一再使用。

Execute Method (XMLA) 方法具有 Parameter 項目 (XMLA) 集合項目,其可讓您定義參數並指派參數值。 在集合中,每個 Parameter 項目 (XMLA) 項目都會定義參數的名稱及其值。

在參數名稱前面加上 @ 字元以參考 XMLA 參數。 語法中允許值的任何位置都可以使用參數呼叫來取代值。 所有 XMLA 參數都會鍵入為文字。

重要

參數定義於 parameters 區段中,且未用於 <STATEMENT> 元素時,會在 XMLA 中產生錯誤回應。 在 <Parameters> 專案中使用且未定義的參數會在 XMLA 中產生錯誤回應。

DAX 陳述式
SUMMARIZECOLUMNS