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 表中的所有行和列。

DAX Evaluate statement

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 升序排序。

DAX Evaluate order by statement

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 升序排序。

DAX Evaluate order by Sales order number statement

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 Evaluate with measure defnition

DAX 查询中的参数

可以对定义完善的 DAX 查询语句进行参数化,然后只需更改参数值即可以反复使用。

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

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

重要

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

DAX 语句
SUMMARIZECOLUMNS
TREATAS
FILTER