DAX 语法

本文介绍公式表达式语言的 DAX 语法和要求。

语法要求

DAX公式始终以等号 (=) 开头。 等号后,可以提供计算结果为标量的任何表达式,或者提供可转换为标量的表达式。 其中包括:

  • 使用标量运算符的标量常量或表达式 (+,-,*,/,>=,...,&&, ...

  • 对列或表的引用。 该 DAX 语言始终使用表和列作为函数的输入,从不使用数组或任意值集。

  • 作为表达式的一部分提供的运算符、常量和值。

  • 函数及其必需参数的结果。 某些 DAX 函数返回表而不是标量,并且必须包装在计算表并返回标量的函数中;除非表是单个列、单行表,否则它被视为标量值。

    大多数 DAX 函数都需要一个或多个参数,这些参数可以包括表、列、表达式和值。 但是,某些函数(例如 PI)不需要任何参数,但始终需要括号来指示 null 参数。 例如,必须始终键入 PI(),而不是 PI。 还可以在其他函数中嵌套函数。

  • 表达 式。 表达式可以包含下列任一项或全部内容:运算符、常量或对列的引用。

例如,以下是所有有效的公式。

公式 结果
= 3 3
= "Sales" 销售
= 'Sales'[Amount] 如果在 Sales 表中使用此公式,将获取当前行的 Sales 表中的“金额”列的值。
= (0.03 *[Amount])

=0.03 * [Amount]
当前表的 Amount 列中的值的百分之三。

尽管此公式可用于计算百分比,但除非在表中应用格式设置,否则结果不会显示为百分比。
= PI() 常量 pi 的值。

公式的行为可能有所不同,具体取决于它们的使用方式。 必须始终了解上下文以及公式中使用的数据与计算中可能使用的其他数据相关的方式。

命名要求

数据模型通常包含多个表。 表及其列共同构成存储在内存中分析引擎(VertiPaq)中的数据库。 在该数据库中,所有表都必须具有唯一名称。 每个表中的列也必须具有唯一的名称。 所有对象名称都 区分大小写;例如, SALESSales 的名称将表示同一个表。

添加到现有数据模型的每个列和度量值都必须属于特定表。 您可以在表中创建计算列时隐式指定包含该列的表,或者在创建度量值并显式指定其定义应存储在哪个表时指定表的名称。

使用表或列作为函数的输入时,通常必须 限定 列名。 列的“完全限定”名称是表名称,后跟用方括号括起来的列名称:例如,'U.S.Sales'[Products]。 在以下情况下引用某列时始终需要完全限定名称:

  • 作为函数的参数, VALUES

  • 作为函数的参数, ALLALLEXCEPT

  • 在函数的筛选器参数中, CALCULATECALCULATETABLE

  • 作为函数的参数, RELATEDTABLE

  • 作为任何时间智能函数的参数

“非限定”列名称只是列的名称,用方括号括起来:例如,[Sales Amount]。 例如,从当前表的同一行引用标量值时,可以使用不限定的列名。

如果表的名称包含空格、保留关键字或不允许的字符,则必须将表名括在单引号中。 如果名称包含 ANSI 字母数字字符范围之外的任何字符,则还必须将表名括在引号中,而不考虑区域设置是否支持字符集。 例如,如果打开一个工作簿,其中包含用西里尔文字符编写的表名(如“Таблица”),则表名必须括在引号中,即使它不包含空格。

注释

若要更轻松地输入列的完全限定名称,请在公式编辑器中使用“自动完成”功能。

表格

  • 每当列来自与当前表不同的表时,都需要表名。 表名在数据库中必须是唯一的。

  • 如果表名包含空格、其他特殊字符或任何非英语字母数字字符,则必须用单引号括起来。

措施

  • 度量值名称必须始终位于方括号中。

  • 度量值名称可以包含空格。

  • 每个度量值名称在模型中必须是唯一的。 因此,引用现有度量值时,表名在度量值名称前面是可选的。 但是,创建度量值时,必须始终指定存储度量值定义的表。

列名称在表的上下文中必须是唯一的;然而,多个表的列允许拥有相同的名称(通过表名称消除歧义)。

通常,可以引用列而不引用它们所属的基表,除非可能存在名称冲突需要解决,或某些函数需要完全限定列名。

保留关键字

如果用于表的名称与 Analysis Services 保留关键字相同,则会引发错误,并且必须重命名该表。 但是,如果对象名称括在方括号(对于列)或引号(表)中,则可以在对象名称中使用关键字。

注释

引号可以由多个不同的字符表示,具体取决于应用程序。 如果从外部文档或网页粘贴公式,请确保检查用于打开和结束引号的字符的 ASCII 代码,以确保它们相同。 否则 DAX ,可能无法将符号识别为引号,使引用无效。

特殊字符

在表、列或度量值的名称中,以下字符和字符类型无效:

  • 前导或尾随空格,除非空格由名称分隔符、方括号或单引号括起来。

  • 控制字符

  • 在对象名称中无效的以下字符:

    .,;':/\\*|?&%$!+=()[]{}<>

对象名称的示例

下表显示了一些对象名称的示例:

对象类型 例子 注释
表名称 销售 如果表名不包含空格或其他特殊字符,则无需用引号括住该名称。
表名称 “加拿大销售” 如果名称包含空格、制表符或其他特殊字符,请将名称括在单引号中。
完全限定的列名称 销售[金额] 表名位于列名前面,列名括在括号中。
完全限定的度量值名称 销售[利润] 表名称位于度量值名称前面,度量值名称用方括号括起来。 在某些上下文中,始终需要完全限定的名称。
非限定的列名称 [金额] 非限定的名称只是列名称,用方括号括起来。 你可以使用非限定名称的上下文包括,同一个表内计算列中的公式,或扫描同一个表的聚合函数中的公式。
带空格的表中的完全限定列 加拿大销售[数量] 表名包含空格,因此必须用单引号括起来。

其他限制

每个函数所需的语法及其可执行的作类型因函数而异。 但是,一般情况下,以下规则适用于所有公式和表达式:

  • DAX 公式和表达式不能修改或插入表中的各个值。

  • 不能使用 DAX 创建计算行。 只能创建计算列和度量值。

  • 定义计算列时,可以将函数嵌套到任何级别。

  • DAX 具有多个返回表的函数。 通常,使用这些函数返回的值作为其他函数的输入,这些函数需要表作为输入。

DAX 运算符和常量

下表列出了支持的 DAX运算符。 有关各个运算符的语法的详细信息,请参阅 DAX 运算符

运算符类型 符号和使用
括号运算符 () 参数的优先顺序和分组
算术运算符 + (新增)

-(减法)

* (乘法)

/(除法)

^ (幂运算)
比较运算符 =(等于)

>(大于)

<(小于)

>=(大于或等于)

<=(小于或等于)

<>(不等于)
文本串联运算符 &(串联)
逻辑运算符 &&(和)

|| (或)

数据类型

你无需强制转换、转换或指定在 DAX 公式中使用的列或值的数据类型。 在公式中使用 DAX 数据时, DAX 自动标识所引用列和键入的值中的数据类型,并在必要时执行隐式转换以完成指定的作。

例如,如果尝试向日期值添加数字,引擎将在函数的上下文中解释作,并将数字转换为通用数据类型,然后以预期格式显示结果(日期)。

但是,可以成功转换的值存在一些限制。 如果值或列具有与当前作不兼容的数据类型, DAX 则返回错误。 此外,DAX 不提供可让你显式更改、转换或强制转换已导入数据模型的现有数据的数据类型的函数。

重要

DAX 不支持使用变体数据类型。 因此,将数据加载或导入数据模型时,预期每列中的数据通常为一致的数据类型。

某些函数返回标量值,包括字符串,而其他函数则处理数字、整数和实数或日期和时间。 每个函数所需的数据类型在节( DAX 函数)中介绍。

可以使用包含多个列和多行数据的表作为函数的参数。 某些函数还返回存储在内存中的表,并可用作其他函数的参数。

日期和时间

DAX 使用 Microsoft SQL Server 使用的日期/时间数据类型存储日期和时间值。 日期时间格式使用浮点数,其中日期值对应于表示自 1899 年 12 月 30 日以来的天数的整数部分。 时间值对应于日期值的十进制部分,其中小时、分钟和秒由一天的十进制分数表示。 DAX 日期和时间函数隐式将参数转换为 datetime 数据类型。

注释

支持的 DAX 的最大 DateTime 值是 9999 年 12 月 31 日 00:00:00。

日期和时间文本

从 2021 年 8 月版本的 Power BI Desktop 开始,可以将 DAX 日期和日期/时间值指定为 dt"YYYY-MM-DD"dt"YYYY-MM-DDThh:mm:ss"dt"YYYY-MM-DD hh:mm:ss" 格式的文本。 如果指定为文本,则不需要在表达式中使用 DATETIMEDATEVALUETIMEVALUE 函数。

例如,以下表达式使用 DATE 和 TIME 函数对 OrderDate 进行筛选:

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > (DATE(2015,1,9) + TIME(2,30,0)) &&[OrderDate] < (DATE(2015,12,31) + TIME(11,59,59))
)

可以将相同的筛选器表达式指定为文本:

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > dt"2015-1-9T02:30:00" && [OrderDate] < dt"2015-12-31T11:59:59"
)

注释

并非所有版本的 Power BI Desktop、Analysis Services 和 Excel 的 Power Pivot 都支持 DAX 日期和日期/时间类型的文本格式。 新的和更新的 DAX 功能通常先在 Power BI Desktop 中引入,然后再包含在 Analysis Services 和 Excel 的 Power Pivot 中。