DAX 语法

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

语法要求

DAX 公式始终以等号 (=) 开头。 在等号后,可提供计算为标量的任何表达式,也可提供能转换为标量的表达式。 这些演示包括以下内容:

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

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

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

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

    大多数 DAX 函数需要一个或多个参数,其中包括表、列、表达式和值。 但是,一些函数(如 PI)不需要任何参数,但始终需要用括号来指明 NULL 参数。 例如,必须始终键入 PI(),而非 PI。 你也可以将函数嵌套在其他函数中。

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

例如,以下公式全部有效。

Formula 结果
= 3 3
= "Sales" Sales
= 'Sales'[Amount] 如果在 Sales 表中使用此公式,你将获得 Sales 表中当前行的 Amount 列的值。
= (0.03 *[Amount])

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

虽然可以使用此公式来计算百分比,但结果不会显示为百分比,除非你在表中应用格式设置。
= PI() 常数 PI 的值。

公式的行为可能不同,具体取决于它们的使用方式。 你应始终清楚上下文,并知道你在公式中使用的数据与计算中可能使用的其他数据的相关性。

命名要求

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

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

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

  • 作为函数 VALUES 的参数

  • 作为函数 ALL 或 ALLEXCEPT 的参数

  • 作为函数 CALCULATE 或 CALCULATETABLE 的筛选器参数

  • 作为函数 RELATEDTABLE 的参数

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

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

如果表名称包含空格、保留关键字或不允许的字符,则必须用单引号引住该表名称。 如果该名称包含 ANSI 字母数字字符范围以外的任何字符,则不论你的区域设置是否支持字符集,均需用引号引住表名称。 例如,如果你打开包含用西里尔字符编写的表名称(如“Таблица”)的工作簿,则必须用引号将表名称引起来,即使它不含空格。

注意

要简化完全限定的列名称的输入,请使用公式编辑器中的“自动完成”功能。

  • 只要列来自其他表而非当前表,就需要表名称。 数据库中的表名称必须是唯一的。

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

度量值

  • 度量值名称必须始终用方括号括起来。

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

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

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

通常,可以无需引用列所属的基表也能引用列,除非可能存在需要解决的名称冲突,或者使用需要完全限定列名称的特定函数。

保留关键字

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

注意

引号可以由几个不同的字符表示,具体取决于应用程序。 如果你从外部文档或网页粘贴公式,请确保检查所使用的左右引号字符的 ASCII 代码,以确定它们相同。 否则,DAX 可能无法将这些符号识别为引号,导致引用无效。

特殊字符

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

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

  • 控制字符

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

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

对象名称示例

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

对象类型 示例 评论
表名 Sales 如果表名称不包含空格或其他特殊字符,则无需用引号引起来。
表名 ‘Canada Sales’ 如果名称包含空格、标签或其他特殊字符,则用单引号引起来。
完全限定的列名称 Sales[Amount] 表名称位于列名称之前,且列名称用方括号括起来。
完全限定的度量值名称 Sales[Profit] 表名称位于度量值名称之前,且度量值名称用方括号括起来。 在某些上下文中,始终需要完全限定的名称。
非限定的列名称 [Amount] 非限定的名称只是列名称,用方括号括起来。 你可以使用非限定名称的上下文包括,同一个表内计算列中的公式,或扫描同一个表的聚合函数中的公式。
带空格的表中的完全限定列 ‘Canada Sales’[Qty] 表名称包含空格,因此必须用单引号引起来。

其他限制

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

  • DAX 公式和表达式不能修改表中的单个值,也不能插入。

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

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

  • DAX 有几个函数会返回表。 通常可将这些函数返回的值用作(需要表作为输入的)其他函数的输入。

DAX 运算符和常数

下表列出了 DAX 支持的运算符。 要详细了解单个运算符的语法,请参阅 DAX 运算符。

运算符类型 符号及其使用
括号运算符 () 参数的优先顺序和分组
算数运算符 +(加法)

-(减法/

符号)

*(乘法)

/(除法)

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

>(大于)

<(小于)

>=(大于或等于)

<=(小于或等于)

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

||(或)

数据类型

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

例如,如果你尝试向日期值添加一个数字,引擎会按函数的上下文解释该运算,并将数字转换为通用日期类型,然后以预期格式(日期)呈现结果。

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

重要

DAX 不支持使用变量数据类型。 因此,当你将数据加载或导入数据模型时,每个列中的数据通常应具有一致的数据类型。

一些函数返回标量值(包括字符串),而其他函数则使用数字(整数和实数)或者日期和时间。 每个函数需要的数据类型在 DAX 函数部分描述。

你可以将包含多列和多行数据的表用作函数的参数。 一些函数还会返回表,这些表存储在内存中,并且可以用作其他函数的参数。

日期和时间

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

日期和时间文本

从 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 中。