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 查詢。 除了 Power BI 工具之外,DAX 查詢也可以在 Fabric 筆記本中執行, 使用 語意連結,使用 python 從語意模型讀取數據,以及使用 執行查詢 REST API,也可以在 Power Automate 中使用。 其他工具,例如 SQL Server Management Studio (SSMS)、Power BI 報表產生器,以及 DAX Studio等開放原始碼工具,也可讓您建立和執行 DAX 查詢。
DAX 查詢會在工具內以數據表的形式傳回結果,讓您能夠在量值中快速建立及測試 DAX 公式的效能,或只是檢視語意模型中的數據。 INFO 和 INFO。VIEW DAX 函式也可以取得語意模型的相關信息,例如數據表清單、數據行、量值等等。
了解查詢之前,你必須要有紮實的 DAX 基本概念。 如果您尚未這麼做,請務必查看 DAX 總覽。
關鍵字
DAX 查詢的簡單語法只包含一個必要的關鍵字,EVALUATE。 EVALUATE 後面接著數據表運算式,例如 DAX 函式或數據表名稱,執行時會輸出結果數據表。 包括輸出結果資料表的資料表運算式有:
- 輸出數據表的常見 DAX 函式,例如 SUMMARIZE、SUMMARIZECOLUMNS、SELECTCOLUMNS、FILTER、UNION、TOPN、ADDCOLUMNS、DATATABLE等等,會使用 EVALUATE 來輸出結果數據表。
- 當依名稱參考時,模型中的表格會使用 EVALUATE 來輸出顯示該表格中的數據結果。 例如,EVALUATE 『Table name』 可以當作 DAX 查詢執行。
- 模型中的量值或任何傳回純量值的 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 資料表中的所有數據列和數據行,做為結果數據表。 這可以透過使用 TOPN 或 FILTER來限制,並通過 ORDER BY進行排序。
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
依月份傳回服裝訂單和每個訂單的平均利潤,依月份遞增順序傳回結果數據表。
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
傳回前 100 個依 SalesOrderLienKey 遞增排序的銷售訂單,然後先依銷售訂單行排序結果,再依銷售訂單排序結果。
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 中,第二個參數定義了在符合第 1 欄第一個值的行中,ORDER BY 的第 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"
從銷售訂單資料表中傳回所有欄位,依照銷售訂單的遞增順序,從SO43661開始。 此銷售訂單之前的數據列不會包含在結果數據表中。
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> = <virtual table definition>) |
(COLUMN <table name>[<column name>] = <scalar expression>) |
) +
]
(EVALUATE <table expression>) +
DEFINE 參數
詞彙 | [定義] |
---|---|
Entity |
MEASURE、VAR、TABLE1或 COLUMN1。 |
name |
量值、var、數據表或數據行定義的名稱。 不能是運算式。 名稱不一定是唯一的。 名稱只存在於查詢的持續時間內。 |
expression |
傳回數據表或純量值的任何 DAX 表示式。 運算式可以使用任何已定義的實體。 如果需要將純量表達式轉換成數據表運算式,請將表達式包裝在具有大括號 {} 的數據表建構函式內,或使用 ROW() 函數傳回單一數據列數據表。 |
[1]注意: 查詢範圍數據表和 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 查詢中定義的數據表,以顯示未購買的產品,並加入一個參考已定義變數的附加欄位。 也會定義並評估一個指標,以計算未購買產品的資料列。
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 查詢中修改。
DAX 查詢中的參數
定義完善的 DAX 查詢語句可以參數化,然後透過參數值中的變更來回使用。
Execute 方法 (XMLA) 方法具有 Parameters 元素 (XMLA) 集合元素,可用於定義參數並指定其值。 在集合中,每個 Parameter Element (XMLA) 元素都會定義參數的名稱和值。
在參數名稱前面加上 @
字元以參考 XMLA 參數。 允許值之語法中的任何位置,都可以將值取代為參數呼叫。 所有 XMLA 參數都會輸入為文字。
重要
參數定義於 parameters 區段中,且未用於 <STATEMENT>
專案中,會在 XMLA 中產生錯誤回應。
在 <Parameters>
專案中使用且未定義的參數會在 XMLA 中產生錯誤回應。