DAX 查询
每当在报表上放置字段或应用筛选器时,报表客户端(如 Power BI 和 Excel)都会执行 DAX 查询。 通过使用 SQL Server Management Studio (SSMS)、Power BI 报表生成器和开源工具(如 DAX Studio),可以创建和运行你自己的 DAX 查询。 DAX 查询直接在工具内以表格形式返回结果,让你可以快速创建 DAX 公式并测试其性能。
在学习查询前,请务必牢固掌握 DAX 基础知识。 如果还没有,请务必查看 DAX 概述。
关键字
DAX 查询的语法很简单,今年包含一个必需关键字 EVALUATE 以及几个可选关键字:ORDER BY、START AT、DEFINE、MEASURE、VAR、TABLE 和 COLUMN。 每个关键字都定义一个在查询期间使用的语句。
EVALUATE(必填)
在最基本的层面上,一个 DAX 查询是包含表表达式的一条 EVALUATE 语句。 至少需要一个 EVALUATE 语句,但一个查询可以包含任意数量的 EVALUATE 语句。
EVALUATE 语法
EVALUATE <table>
EVALUATE 参数
术语 | 定义 |
---|---|
表 | 表表达式。 |
EVALUATE 示例
EVALUATE
'Internet Sales'
以表的形式返回 Internet Sales 表中的所有行和列。
ORDER BY(可选)
ORDER BY(可选)关键字定义一个或多个用于对查询结果排序的表达式。 针对结果的每一行都可以计算的任何表达式都是有效的。
ORDER BY 语法
EVALUATE <table>
[ORDER BY {<expression> [{ASC | DESC}]}[, …]]
ORDER BY 参数
术语 | 定义 |
---|---|
表达式 | 任何返回单个标量值的 DAX 表达式。 |
ASC | (默认)升序排序。 |
DESC | 降序排序。 |
ORDER BY 示例
EVALUATE
'Internet Sales'
ORDER BY
'Internet Sales'[Order Date]
以表的形式返回 Internet Sales 表中的所有行和列,按 Order Date 升序排序。
START AT(可选)
START AT(可选)关键字用于 ORDER BY 子句内 。 它定义查询结果开始的值。
START AT 语法
EVALUATE <table>
[ORDER BY {<expression> [{ASC | DESC}]}[, …]
[START AT {<value>|<parameter>} [, …]]]
START AT 参数
术语 | 定义 |
---|---|
值 | 常数值。 不能是表达式。 |
参数 | 以 @ 字符为前缀的 XMLA 语句中参数的名称。 |
START AT 备注
START AT 参数与 ORDER BY 子句中的列具有一对一的对应关系。 START AT 子句中参数的数量可以与 ORDER BY 子句中参数的数量一样多,但不能超过 ORDER BY 子句中参数的数量。 START AT 中的第一个参数定义了 ORDER BY 列的列 1 中的起始值。 START AT 中的第二个参数定义满足列 1 的第一个值的行中 ORDER BY 列的列 2 中的起始值。
START AT 示例
EVALUATE
'Internet Sales'
ORDER BY
'Internet Sales'[Sales Order Number]
START AT "SO7000"
从 SO7000 开始返回 Internet Sales 表中的所有行和列,按 Sales Order 升序排序。
DEFINE(可选)
可选的 DEFINE 关键字引入一个或多个计算实体定义,这些定义仅在查询期间存在。 定义位于 EVALUATE 语句的前面,并且对查询中的所有 EVALUATE 语句都有效。 定义可以是变量、度量值、表1和列1。 定义可以引用出现在当前定义之前或之后的其他定义。 如果查询中包含 DEFINE 关键字,则至少需要一个定义。
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 参数
术语 | 定义 |
---|---|
实体 | MEASURE、VAR、TABLE1 或 COLUMN1。 |
name | 度量值、变量、表或列定义的名称。 它不能是表达式。 此名称不必是唯一的。 此名称仅在查询期间存在。 |
表达式 | 任何返回表或标量值的 DAX 表达式。 表达式可以使用任何定义的实体。 如果需要将标量表达式转换为表表达式,请使用大括号 {} 将表达式包装在表构造函数中,或使用 ROW() 函数返回一个具有单行的表。 |
[1]警告:查询范围内的 TABLE 和 COLUMN 定义仅供内部使用。 虽然可以在不出现语法错误的情况下为查询定义 TABLE 和 COLUMN 表达式,但它们可能会产生运行时错误,因此不建议这样做。
DEFINE 备注
一个 DAX 查询可以有多个 EVALUATE 语句,但只能有一个 DEFINE 语句。 DEFINE 语句中的定义可应用于查询中的任何 EVALUATE 语句。
DEFINE 语句中至少需要有一个定义。
查询的度量值定义会覆盖名称相同的模型度量值,但仅在查询内使用。 它们不会影响模型度量值。
VAR 名称具有特殊限制。 若要了解详细信息,请参阅 VAR - 参数。
DEFINE 示例
DEFINE
MEASURE 'Internet Sales'[Internet Total Sales] =
SUM ( 'Internet Sales'[Sales Amount] )
EVALUATE
SUMMARIZECOLUMNS (
'Date'[Calendar Year],
TREATAS (
{
2013,
2014
},
'Date'[Calendar Year]
),
"Total Sales", [Internet Total Sales],
"Combined Years Total Sales",
CALCULATE (
[Internet Total Sales],
ALLSELECTED ( 'Date'[Calendar Year] )
)
)
ORDER BY [Calendar Year]
返回计算的 2013 年和 2014 年总销售额,并将算出的 2013 年和 2014 年的总销售额合并为一个表。 DEFINE 语句中的度量值 Internet Total Sales 在 Total Sales 和 Combined Years Total Sales 表达式中都有使用。
DAX 查询中的参数
可以对定义完善的 DAX 查询语句进行参数化,然后只需更改参数值即可以反复使用。
Execute 方法 (XMLA)具有一个 Parameters 元素 (XMLA) 集合元素,可以定义参数并为其分配值。 在集合中,每个 Parameter 元素 (XMLA)都定义了参数的名称及其值。
通过为参数名称加上 @
字符作为前缀来引用 XMLA 参数。 对于语法中允许值所在的任何位置,都可以使用参数调用来替换它。 所有 XMLA 参数都作为文本键入。
重要
在参数部分中定义但未在 <STATEMENT> 元素中使用的参数在 XMLA 中将生成错误响应。 <Parameters> 元素中使用但未定义的参数在 XMLA 中将生成错误响应。