DAX 查询

每当报表中显示可视化对象或将字段添加到表中时,报告客户端(例如 Power BI 和 Excel)都会执行 DAX 查询,当应用筛选器时,这些 DAX 查询会进行调整。 Power BI Desktop 中的 性能分析器 可以显示这些 DAX 查询,甚至可以在 DAX Power BI Desktop 的查询视图中运行这些查询。

通过在 Power BI Desktop 中使用查询视图或在 Power BI 服务中使用写入DAX查询,可以创建并运行自己的DAX查询。 借助 Microsoft Fabric,可以使用 Copilot 进一步提高工作效率,以便在桌面或 Web 的查询视图中编写DAX查询DAX。 除了 Power BI 工具之外,DAX还可以使用语义链接Fabric 笔记本中运行查询,以便通过 Python 从语义模型读取数据,以及使用 Power Automate 中也提供的执行查询 REST API。 其他工具(如 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 可以将“表名” 作为 DAX 查询运行。
  3. 模型中的度量值或任何返回标量值的公式,与DAX 一起使用时,当它们被大括号括起来时,会将值显示为结果表。 例如, EVALUATE 可以将 {[Total Sales]}EVALUATE {COUNTROWS('Sales')} 作为 DAX 查询运行。 这些函数称为 表构造函数

有多个特定于 DAX 查询的可选关键字: ORDER BY、、 START AT、 DEFINE、 MEASURE、 VARTABLE 和 COLUMN。

EVALUATE (必需)

在最基本的级别, DAX 查询是包含 EVALUATE 表表达式的语句。 但至少需要一个 EVALUATE 语句,但查询可以包含任意数量的 EVALUATE 语句。

EVALUATE 语法

EVALUATE <table>

EVALUATE 参数

术语 Definition
table 表格表达式。

EVALUATE 例

EVALUATE
	'Sales Order'

以结果表的形式返回 Sales Order 表中的所有行和列。 可以通过使用 TOPNFILTER 来限制,并使用 ORDER BY 进行排序。

屏幕截图显示如何在 Power BI Desktop 的EVALUATE查询视图中使用DAX进行DAX查询。

ORDER BY (可选)

可选 ORDER BY 关键字定义用于对查询结果进行排序的查询或表达式中的一个或多个列。 可为结果的每一行计算的任何表达式都有效。 查询本身中的任何列也有效。

语义模型中的列属性排序不适用于 DAX 查询结果。 如果某一列需要根据模型中的其他列排序,例如月份名称的情况,则排序依据的列也应包含在DAX查询中,以便在ORDER BY中使用。

ORDER BY 语法

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

ORDER BY 参数

术语 Definition
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 的ORDER BY查询视图中使用DAX进行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 的 TOPN 查询视图中使用 ORDER BY 和 DAX 进行 DAX 查询。

START AT (可选)

START AT 关键字是可选的,用于 ORDER BY 子句中。 它定义查询结果开始的值。

START AT 语法

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

START AT 参数

术语 Definition
value 常数值。 不能是表达式。
parameter XMLA 语句中带有 @ 字符前缀的参数的名称。

START AT 言论

START AT 参数与子句中的 ORDER BY 列具有一对一对应关系。 在START AT子句中可以有与ORDER BY子句相同数量的参数,但不能更多。 第一个参数 START AT 定义列第 1 列中的 ORDER BY 起始值。 第二个参数 START AT 定义满足第 1 列第一个值的行中列第 2 ORDER BY 列的起始值。

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 开始,按销售订单升序返回销售订单表中的所有列。 结果表中不包含此销售订单之前的行。

屏幕截图显示如何在 Power BI Desktop 的 ORDER BY 查询视图中使用 START AT 和 DAX 进行 DAX 查询。

DEFINE (可选)

可选 DEFINE 关键字引入了一个或多个计算实体定义,这些定义仅在查询期间存在。 与EVALUATE不同,查询中DEFINE只能有一个包含一个或多个DAX定义的块。 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 参数

术语 Definition
Entity MEASURE、 VAR表1 或 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 的DEFINE查询视图中使用DAX进行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 的DEFINE查询视图中使用MEASUREDAX进行DAX查询的屏幕截图。

查询中的 DAX 参数

可以通过参数化定义 DAX 的查询语句,然后可以反复使用,只需更改参数值。

Execute 方法(XMLA) 具有一个 Parameters 元素(XMLA) 集合元素,该集合元素允许定义参数并分配值。 在集合中,每个 Parameter 元素(XMLA) 元素定义参数的名称及其值。

通过为参数的名称加上字符 @ 前缀来引用 XMLA 参数。 允许值的语法中的任何位置,都可以将该值替换为参数调用。 所有 XMLA 参数都键入为文本。

重要

参数节中定义但未在 <STATEMENT> 元素中使用的参数会在 XMLA 中生成错误响应。 元素中使用且未定义的参数在 <Parameters> XMLA 中生成错误响应。