编写 DAX 公式

已完成

每个模型计算类型、计算表、计算列或度量值都由其名称定义,后跟等号 (=),然后是 DAX 公式。 使用下面的模板来创建一个模型计算:

<Calculation name> = <DAX formula>

例如,将复制 Date 表数据的 Ship Date 计算表定义为:

Ship Date = 'Date'

DAX 公式由返回结果的表达式组成。 结果可以是一个表对象,也可以是一个标量值。 计算表公式必须返回一个表对象;计算列公式和度量值公式必须返回一个标量值(单一值)。

使用以下内容来汇编公式:

  • DAX 函数
  • DAX 运算符
  • 对模型对象的引用
  • 常数值,如数字 24 或文字文本“FY”(“会计年度”的缩写形式)
  • DAX 变量
  • 空格

提示

在 Power BI Desktop 中输入 DAX 公式时,可以使用 IntelliSense 的优势。 IntelliSense 是一个代码补全辅助工具,它列出了函数和模型资源。 当你选择一个 DAX 函数时,它还会为你提供定义和说明。 建议使用 IntelliSense 来帮助你快速生成准确的公式。

DAX 函数

与 Microsoft Excel 类似,DAX 是一种函数语言,这意味着公式依赖于函数来实现特定的目标。 通常情况下,DAX 函数包含允许传入变量的参数。 公式可以使用多个函数调用,并且通常会在其他函数中嵌套函数。

在公式中,函数名称后面必须有括号。 变量将传入括号内。

注意

有些函数不使用参数,或者选用参数。

本模块后面的部分将介绍如何使用 DAX 函数。

DAX 运算符

公式还依赖于运算符,后者可以执行算术计算、比较值、处理字符串或测试条件。

本模块后面的部分对 DAX 运算符进行了详细介绍。

对模型对象的引用

公式只能引用三种类型的模型对象:表、列或度量值。 它不能引用层次结构或层次结构级别。 (回想一下,层次结构级别是基于列的,所以公式可以引用层次结构级别的列。)

表引用

当你在公式中引用一个表时,正式的表名是用单引号括起来的。 在下面的计算表定义中,请注意,Date 表是用单引号括起来的。

Ship Date = 'Date'

不过,如果同时满足以下两个条件,则可以省略单引号:

  1. 表名不包含嵌入的空格。
  2. 表名不是 DAX 使用的保留字。 所有 DAX 函数名称和运算符都是保留字。 Date 是一个 DAX 函数名称,用于说明在引用名为 Date 的表时,必须将其括在单引号内的原因。

在下面的计算表定义中,可在引用 Airport 表时省略单引号:

Arrival Airport = Airport

列引用

当你在公式中引用一列时,必须用方括号将列名括起来。 也可以在列名前加上表名。 例如,下面的度量值定义引用“销售额”列。

Revenue = SUM([Sales Amount])

由于列名在表中是唯一的,但在模型中不一定是唯一的,因此可以在列引用前加上它的表名,以消除列引用的歧义。 这个已消除歧义的列被称为“完全限定的列”。 一些 DAX 函数要求传递完全限定的列。

提示

为了提高公式的可读性,建议始终在列引用前加上其表名。

可以将前面的示例度量值定义改写为:

Revenue = SUM(Sales[Sales Amount])

度量值引用

当你在公式中引用一个度量值(如列名引用)时,必须用方括号将度量值名括起来。 例如,下面的度量值定义引用“收入”和“成本”度量值。

Profit = [Revenue] - [Cost]

如果你是 DAX 初学者,在你尝试读取公式时,看到列和度量值引用始终括在方括号内,可能会混淆。 不过,在熟练掌握 DAX 基础知识后,就能判断出它是哪种类型的对象了,因为在 DAX 公式中,列和度量值的使用方式是不同的。

提示

可以在度量值引用前面加上它的表名。 然而,度量值是模型级别的对象。 虽然它们被分配到一个主表,但这只是一种表面关系,用于在“字段”窗格中以逻辑方式组织度量值。

因此,虽然我们建议始终在列引用前加上其表名,但对于度量值来说,情况正好相反:建议永远不要在度量值引用前加上其表名。

有关详细信息,请参阅列引用和度量值引用

DAX 变量

公式可以声明 DAX 变量以存储结果。

本模块稍后将介绍如何以及何时使用 DAX 变量。

空格

空格是指可以通过便捷易懂的方式来设置公式格式的那一种字符。 空格字符包括:

  • 空格
  • 制表符
  • 回车符

空格是可选的,它不会修改公式逻辑,也不会对性能产生负面影响。 强烈建议采用一种格式样式,并以一致的方式应用它,并考虑以下建议:

  • 在运算符之间使用空格。
  • 使用制表符缩进嵌套函数调用。
  • 使用回车符分隔函数参数,特别是当它太长而无法放在一行时。 采用这种方式设置格式可以更轻松地排查故障,特别是当公式缺少括号时。
  • 使用过多的空格容易出错。

提示

在编辑栏中,若要输入回车符,请按 Shift + Enter。 只需按 Enter 即可提交公式。

来看看下面编写的单行度量值定义,其中包含五个 DAX 函数调用:

Revenue YoY % = DIVIDE([Revenue] - CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date])), CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date])))

下面的示例是相同的度量值定义,但现在已进行了格式设置,更方便读者阅读和理解:

Revenue YoY % =
DIVIDE(
    [Revenue]
        - CALCULATE(
            [Revenue],
            SAMEPERIODLASTYEAR('Date'[Date])
    ),
    CALCULATE(
        [Revenue],
        SAMEPERIODLASTYEAR('Date'[Date])
    )
)

尝试自行设置度量值的格式。 打开 Adventure Works DW 2020 M02.pbix Power BI Desktop 文件,然后在“字段”窗格中展开 Sales 表,并选择“收入 YoY 百分比”度量值。 在编辑栏中,使用制表符和回车符可生成与上一示例相同的结果。 在添加回车符时,请注意按下 Shift + Enter。

还可以进一步改进此度量值定义以提高可读性和性能,这将在本模块后面的部分中进行介绍。

提示

另一个可以帮助你设置计算格式的优秀格式设置工具是 DAX 格式化程序。 使用此工具可以粘贴计算并设置其格式。 然后,可以将经过格式设置的计算复制到剪贴板,然后将其粘贴回 Power BI Desktop。