Excel Dax 简明教程

Excel DAX - Formulas

DAX 是用于在 Power PivotTables 中创建自定义计算的公式语言。您可以使用专用于处理关系数据并在 DAX 公式中执行动态聚合的 DAX 函数。

DAX formulas 与 Excel 公式很相似。要创建 DAX 公式,您需要键入一个等号,之后是函数名称或表达式以及任何必需的值或参量。

DAX Functions vs. DAX Formulas

DAX 公式可以包括 DAX 函数并利用它们。这就是 DAX 公式在重要方式上与 DAX 函数有所不同的原因。

  1. DAX 函数始终引用一个完整的列或表。如果您只想从表或列中使用特定值,您可以向公式添加筛选器。

  2. 如果您希望按行方式自定义计算,Power Pivot 会提供一些允许您使用当前行值或相关值来执行随上下文而变化的计算的函数。

  3. DAX 包含一类作为其结果返回表(而不是单一值)的函数。可以使用这些函数来为其他函数提供输入内容,从而计算整个表或列的值。

  4. 一些 DAX 函数提供了时间智能,它允许您使用有意义的日期范围创建计算,并在并行期间比较结果。

Understanding DAX Formula Syntax

每个 DAX 公式都有以下语法 −

  1. 每个公式都必须以等号开头。

  2. 在等号右侧,您可以键入或选择函数名称,或键入表达式。表达式可以包含连接 DAX 运算符的表名称和列名称。

以下是部分有效的 DAX 公式 −

  1. [column_Cost] + [column_Tax]

  2. = Today ()

Understanding IntelliSense Feature

DAX 提供了 IntelliSense 功能,该功能可帮助您迅速准确地编写 DAX 公式。依托于此功能,您不必完整键入表、列和函数名称,而是在编写 DAX 公式时从下拉列表中选择相关的名称即可。

  1. 开始键入函数名称的前几个字母。自动完成将显示名称起始于这些字母的可用函数列表。

  2. 将指针置于任何函数名称上。将会显示 IntelliSense 工具提示,向您说明函数的用法。

  3. 单击函数名称。函数名称会显示在公式栏中,且语法也会显示,供您在选择参数时参考。

  4. 键入所需的表名称的首字母。自动完成将显示名称起始于该字母的可用表和列列表。

  5. 按 Tab 键或单击名称以将一个项目从自动完成列表添加到公式中。

  6. 单击 Fx 按钮以显示可用的函数列表。若要从下拉列表中选择函数,请使用箭头键来高亮显示项目,然后单击 OK 将该函数添加到公式中。

  7. 向函数提供参数,通过从可能的表和列的下拉列表中选择它们或通过键入所需的值来提供。

强烈建议使用这个好用的 IntelliSense 功能。

Where to Use DAX Formulas?

您可以在创建计算列和计算字段时使用 DAX 公式。

  1. 您可以通过添加列,然后在公式栏中键入表达式,在计算列中使用 DAX 公式。您在 PowerPivot 窗口中创建这些公式。

  2. 您可以在计算字段中使用 DAX 公式。您在如下位置创建这些公式:- 在 Excel 窗口中的“计算字段”对话框中,或在 Power Pivot 窗口中的表的计算区域中。

相同公式在计算列或计算字段中使用的行为方式可能会不同。

  1. 在计算列中,始终将公式应用于列中的每行,在整个表中应用。取决于行上下文,该值可能会改变。

  2. 然而在计算字段中,结果的计算极度依赖于上下文。也就是说,透视表的布局以及行列标题的选择会影响计算中所使用的值。

理解 DAX 中上下文的概念对于编写 DAX 公式非常重要。在您的 DAX 旅程之初,这可能有些困难,但一旦您掌握了它,您就能编写出适用于复杂和动态数据分析的有效 DAX 公式。有关详细信息,请参阅章节 – DAX 上下文。

Creating a DAX Formula

您已经在上一节中学习了 IntelliSense 功能。请记住在创建任何 DAX 公式时使用它。

使用以下步骤来创建 DAX 公式 -

  1. Type an equal sign.

  2. 在等号的右侧,键入以下内容 - 键入函数或表名的第一个字母,然后从下拉列表中选择完整名称。如果您选择了函数名称,请键入括号“(”。如果您选择了表名,则键入方括号“[”。键入列名的第一个字母,然后从下拉列表中选择完整名称。使用“]”关闭列名,并使用“)”关闭函数名称。在表达式之间键入 DAX 运算符,或键入“,”以分隔函数参数。重复步骤 1 - 5,直至 DAX 公式完成。

例如,您希望找到东部地区的总销售额。您可以编写如下所示的 DAX 公式。East_Sales 是表的名称。Amount 是表中的列。

SUM ([East_Sales[Amount])

正如在章节 – DAX 语法中已经讨论过的,建议在每次引用任何列名时使用表名连同列名。这被称为 - “完全限定的名称”。

DAX 公式会根据它是用于计算字段还是计算列而有所不同。有关详细信息,请参阅以下章节。

Creating a DAX Formula for a Calculated Column

您可以在 Power Pivot 窗口中为计算列创建 DAX 公式。

  1. 单击要添加计算列的表的选项卡。

  2. 在功能区上点击“设计”选项卡。

  3. Click Add.

  4. 在公式栏中键入计算列的 DAX 公式。

= DIVIDE (East_Sales[Amount], East_Sales[Units])

此 DAX 公式对 East_Sales 表中的每一行执行以下操作 -

  1. 将一行中 Amount 列中的值除以同一行中 Units 列中的值。

  2. 将结果放置在同一行中的新添加的列中。

  3. 重复步骤 1 和 2,直至表中的所有行完成。

您已使用上述公式添加了这些单位所售单价的列。

  1. 正如您所观察到的,计算列也需要计算空间和存储空间。因此,仅在必要时使用计算列。尽可能且足够时使用计算字段。

有关详细信息,请参阅章节 - 计算列。

Creating a DAX Formula for a Calculated Field

可以在 Excel 窗口或 Power Pivot 窗口中创建已计算字段的 DAX 公式。对于已计算字段,需要预先提供名称。

  1. 要在 Excel 窗口中为已计算字段创建 DAX 公式,请使用计算字段对话框。

  2. 要在 Power Pivot 窗口中为已计算字段创建 DAX 公式,请单击相关表计算区域中的单元格。使用 CalculatedFieldName:= 开始 DAX 公式。

例如,Total East Sales Amount:=SUM ([East_Sales[Amount])

如果在 Excel 窗口中使用计算字段对话框,则可以在保存公式之前检查公式,并养成强制性习惯以确保使用正确的公式。

有关这些选项的更多详细信息,请参阅章节 - 计算字段。

Creating DAX Formulas Using the Formula Bar

Power Pivot 窗口还具有类似于 Excel 窗口公式栏的公式栏。公式栏使用自动完成功能使得使用最小语法错误更容易创建和编辑公式。

  1. 要输入表名,请开始输入表名。公式自动完成提供包含以这些字母开头的有效表名的下拉列表。如果需要,您可以从一个字母开始,然后键入更多字母来缩小列表范围。

  2. 要输入列名,可以从所选表中的列名列表中选择。在表名右侧键入方括号‘[’,然后从所选表中的列列表中选择该列。

Tips for Using AutoComplete

以下是使用自动完成的其中一些技巧 -

  1. 可以在 DAX 公式中嵌套函数和公式。在这种情况下,可以在具有嵌套函数的现有公式中间使用公式自动完成。插入点之前的文本用于在下拉列表中显示值,插入点之后的所有文本保持不变。

  2. 您为常量创建的已定义名称不会显示在自动完成下拉列表中,但您仍然可以输入已定义名称。

  3. 函数的闭括号不会自动添加。您需要自己添加。

  4. 您必须确保每个函数在语法上正确。

Understanding Insert Function Feature

您可以在 Power Pivot 窗口和 Excel 窗口中找到标记为 fx 的插入函数按钮。

  1. Power Pivot 窗口中的插入函数按钮位于公式栏的左侧。

  2. Excel 窗口中的插入函数按钮位于计算字段对话框中,公式的右侧。

单击 fx 按钮时,插入函数对话框会出现。插入函数对话框是找到与您的 DAX 公式相关的 DAX 函数最简单的方法。

插入函数对话框可以按类别帮助您选择函数,并为每个函数提供一个简短的描述。

understanding insert function

Using Insert Function in a DAX Formula

假设您希望创建以下计算域:

Medal Count: = COUNTA (]Medal])

您可以按照以下步骤使用插入函数对话框:

  1. 单击结果表的计算区域。

  2. 在公式栏中键入以下内容:

Medal Count: =
  1. 单击插入函数按钮 ( fx )。

“插入函数”对话框随即出现。

  1. 如以下屏幕截图所示,在“选择类别”框中选择“统计”。

  2. 如以下屏幕截图所示,在“选择函数”框中选择 COUNTA。

using insert function

正如您观察到的,会显示所选 DAX 函数语法和函数描述。这能确保它正是您想要插入的函数。

  1. 单击“确定”。“奖牌数: = COUNTA(”会显示在公式栏中,函数语法提示工具也会出现。

  2. 键入 [。这表示您即将键入列名称。当前表中的所有列名和计算域将显示在下拉列表中。您可以使用智能感知功能完成公式。

  3. 键入 M。下拉列表中显示的名称将仅限于以“M”开头的名称。

  4. Click Medal.

click medal
  1. 双击“奖牌”。“奖牌数: = COUNTA([奖牌]”将显示在公式栏中。关闭括号。

  2. 按下 Enter 键。现在大功告成了。您还可以使用相同的过程创建一个计算列。您还可以在 Excel 窗口中使用插入函数功能,按照相同的步骤在“计算域”对话框中插入一个函数。

  3. 单击“公式”右侧的“插入函数”按钮 ( fx )。

“插入函数”对话框随即出现。其余的步骤与以上步骤相同。

Using Multiple Functions in a DAX Formula

DAX 公式最多可以包含 64 个嵌套函数。但是,DAX 公式不太可能包含这么多嵌套函数。

如果 DAX 公式包含多个嵌套函数,其具有以下缺点:

  1. 要创建这个公式的话将非常困难。

  2. 如果公式存在错误,那么调试起来将非常困难。

  3. 公式评估的速度不会很快。

在此类情况下,你可以将公式分割为更小的、更易于管理的公式,并逐渐建立大的公式。

Creating a DAX Formula Using Standard Aggregations

当你执行数据分析时,你将对汇总数据进行计算。有几种 DAX 聚合函数,例如,你在 DAX 公式中可以使用 SUM、COUNT、MIN、MAX、DISTINCTCOUNT 等函数。

你可以使用 Power Pivot 窗口中的自动求和功能,通过使用标准聚合自动创建公式。

  1. 在 Power Pivot 窗口中单击结果选项卡。结果表将显示出来。

  2. 单击奖牌列。整个列(奖牌)将被选中。

  3. 单击功能区上的“主页”选项卡。

  4. 单击计算组中的自动求和旁边的向下箭头。

creating dax formula using standard aggregations
  1. 在下拉列表中单击 COUNT。

click count

正如你可以观察到的,在列(奖牌)下面的计算区域中,显示了计算字段奖牌数。DAX 公式还出现在公式栏中:

Count of Medal: = COUNTA([Medal])

自动求和功能已为你完成了工作,为数据聚合创建了计算字段。此外,自动求和已采用 DAX 函数 COUNT 的适当变体,即 COUNTA(DAX 具有 COUNT、COUNTA、COUNTAX 函数)。

谨记一点,要在使用自动求和功能,你需要在功能区上单击自动求和旁边的向下箭头。如果你单击自动求和本身,你会得到:

Sum of Medal: = SUM([Medal])

并且,因为奖牌不是数值数据列,列中的文本无法转换为数字,所以会标记为错误。

error

你可以参阅章节 DAX Error Reference ,了解有关 DAX 错误的详细信息。

DAX Formulas and the Relational Model

正如你所知,在 Power Pivot 数据模型中,你可以使用多张数据表,并通过定义关系连接这些表。这将使你能够创建有趣的 DAX 公式,该公式使用相关表中列之间的关联来进行计算。

当你创建两个表之间的关系时,你预期要确保用作键的两个列具有匹配的值,如果不是全部的话,至少也应针对大多数行匹配。在 Power Pivot 数据模型中,可以在键列中拥有不匹配的值,仍然可以创建关系,因为 Power Pivot 不会强制参考完整性(查看下一部分了解详细信息)。但是,键列中存在空白值或不匹配值可能会影响 DAX 公式的结果和数据透视表的显示。

Referential Integrity

建立参考完整性涉及构建一组规则,以便在你输入或删除数据时,保留在表之间定义的关系。如果你没有专门确保这一点,由于 Power Pivot 不会强制执行,因此在进行数据更改之前创建的 DAX 公式可能无法得到正确的结果。

如果你强制执行参考完整性,你可以防止以下陷阱:

  1. 当主表中没有关联的行时,向相关表中添加行(即,主键列中具有匹配值的行)。

  2. 更改主表中的数据,导致相关表中出现孤立行(即,主键列中的数据值在主表主键列中没有匹配值的行)。

  3. 当相关表中存在匹配的数据值时,从主表中删除行。