Excel DAX 快速指南



Excel DAX - 概述

DAX 代表 **D**ata **A**nalysis **Ex**pressions。DAX 是一种公式语言,是函数、运算符和常量的集合,可用于公式或表达式中计算和返回一个或多个值。DAX 是与 Excel Power Pivot 数据模型关联的公式语言。

它不是一种编程语言,而是一种公式语言,允许用户在计算列和计算字段(也称为度量值)中定义自定义计算。DAX 帮助您从数据模型中已存在的数据中创建新信息。DAX 公式使您能够执行数据建模、数据分析,并将结果用于报告和决策制定。

DAX 包含一些在 Excel 公式中使用的函数,但功能已修改,并增加了旨在处理关系数据和执行动态聚合的其他函数。

DAX 的重要性

DAX 的基础是数据模型,即 Excel 中的 Power Pivot 数据库。数据模型由表组成,可以在表之间定义关系,以便组合来自不同来源的数据。数据模型的数据连接可以根据源数据变化随时刷新。数据模型利用 Power Pivot xVelocity 内存分析引擎 (VertiPaq),使数据操作尽可能快,并容纳数千行数据。有关数据模型的更多信息,请参阅教程 – Power Pivot。

DAX 结合数据模型,使 Excel 中的几个强大功能成为可能——Power Pivot、Power Pivot 表、Power Pivot 图表和 Power View。您可以使用 DAX 来解决许多基本计算和数据分析问题。

DAX 在 Power BI 中也很有用,可以创建新的 Power BI Desktop 文件并将一些数据导入其中。此外,DAX 公式提供了诸如分析跨产品类别和不同日期范围的增长百分比、计算与市场趋势相比的同比增长等功能。

学习如何创建有效的 DAX 公式将帮助您充分利用您的数据。当您获得所需的信息时,您可以开始解决影响您底线的实际业务问题。这就是 Power BI 的强大功能,而 DAX 将帮助您实现这一点。

本教程的先决条件

本教程是 Excel Power Pivot 教程的扩展,您已经学习了 Power Pivot 功能、数据模型、关系、Power Pivot 表、Power Pivot 图表等。在深入研究 DAX 之前,最好复习一下本教程,因为本教程更多的是关于 DAX 语言,您可以在其中为数据模型中的数据分析编写公式并报告这些结果。

本教程还介绍了 DAX 函数,这些函数类似于 Excel 函数,但有一些变化。提供了 Excel 函数和 DAX 函数的比较,以帮助您区分两者。同样,比较了 Excel 公式和 DAX 公式,并讨论了它们的异同。充分了解这些差异将有助于您高效地编写有效的 DAX 公式。

本教程不需要了解 Excel 函数和 Excel 公式,因为 DAX 完全用于 Power Pivot 窗口中的数据模型。您只需进入 Excel 工作表以查看基于数据模型的 Power Pivot 表、Power Pivot 图表和 Power View 可视化效果。但是,如果您是 Excel 专业人士,并且对 Excel 函数和公式有丰富的知识,最好记下上一节中提到的内容以及本教程中提供的详细信息。

计算列

计算列是您可以通过 DAX 公式添加到数据模型中表的列。您已经在 Excel Power Pivot 教程中学习过它们,但您将在“计算列”一章中详细了解,因为 DAX 都是关于计算列、计算字段和 DAX 函数的。

计算字段/度量值

您不能通过编辑来更改数据模型中表的中的值。但是,您可以向表中添加计算字段,这些字段可用于 Power Pivot 表中。通过指定名称和定义 DAX 公式来定义计算字段。有关详细信息,请参阅“计算字段”一章 - 计算字段

在 Excel 2013 之前的 Excel 版本中,计算字段被命名为度量值。在 Excel 2016 中,它们被重新命名为度量值。在本教程中,我们将称它们为计算字段。但是,请注意,术语“计算字段”和“度量值”是同义词,在各方面都指的是相同的内容。

定义和存储计算字段后,您可以对其进行编辑。您可以更改定义中使用的 DAX 公式,也可以重命名计算字段。您将在“编辑计算字段”一章中了解这一点 - 编辑计算字段。您可以删除计算字段。请参阅“删除计算字段”一章 - 删除计算字段

DAX 公式

DAX 公式构成 DAX 语言的核心。您可以通过使用 DAX 公式定义来创建计算字段和计算列。您可以为数据分析操作编写 DAX 公式。DAX 公式不引用表中单个单元格或单元格范围,而是引用数据模型中的表和列。数据模型中表中的列必须包含相同的数据类型。

DAX 公式包含表、列、计算列、计算字段、DAX 运算符和 DAX 函数。请参阅“DAX 公式”一章 - DAX 公式 以详细了解。

DAX 语法

与任何语言一样,作为公式语言的 DAX 也具有语法。您的 DAX 公式应遵循 DAX 语法,否则,您要么在设计时或运行时遇到错误,要么收到不正确的结果。

您将在“DAX 语法”一章中学习以下内容 - DAX 语法

  • 表、列的 DAX 命名要求
  • DAX 运算符
  • DAX 特殊值
  • DAX 数据类型
  • DAX 隐式数据类型转换

DAX 运算符

DAX 是一种公式语言,因此在定义公式时会使用运算符。DAX 有以下类型的运算符 -

  • DAX 算术运算符
  • DAX 比较运算符
  • DAX 文本连接运算符
  • DAX 逻辑运算符

DAX 运算符优先级顺序也已定义,并且与 Excel 运算符优先级顺序不同。请参阅“DAX 运算符”一章 - DAX 运算符

DAX 标准参数

DAX 函数语法对参数有一定的要求。这是因为 DAX 函数参数可以是表或列或计算字段或其他 DAX 函数。请参阅“DAX 标准参数”一章 - DAX 标准参数

DAX 函数

Excel 2013 有 246 个 DAX 函数,您可以在 DAX 公式中使用它们。您将在“DAX 函数”一章中按类别学习这些函数。但是,有关每个 DAX 函数语法、参数、用法和返回值的详细信息,您必须参考我们的教程 - DAX 函数。每个 DAX 函数描述中使用的部分名称在“理解 DAX 函数”一章中给出 - 理解 DAX 函数

由于 DAX 函数需要在编写 DAX 公式中使用,并且所用 DAX 函数的结果取决于它们的使用上下文,因此您可能需要在这两个教程之间来回切换,才能掌握您将在使用 DAX 和 Power BI 的数据建模中使用的 DAX。

DAX 特殊函数

DAX 有一些函数使 DAX 功能强大。这些 DAX 函数属于以下类别 - DAX 时间智能函数和 DAX 筛选器函数,需要特别说明。您将在“理解 DAX 时间智能”一章中了解 DAX 时间智能函数 - 理解 DAX 时间智能。您将在“DAX 筛选器函数”一章中了解 DAX 筛选器函数的用法 - DAX 筛选器函数

DAX 评估上下文

DAX 公式的结果可能会因用于评估的上下文而异。DAX 有两种类型的评估上下文 - 行上下文和筛选器上下文。请参阅“DAX 评估上下文”一章 - DAX 评估上下文

DAX 公式

DAX 是一种公式语言,您必须充分利用它来编写 DAX 公式。请参阅“DAX 公式”一章以了解公式语法以及如何轻松正确地创建它们。

只要数据刷新和 DAX 公式重新计算,DAX 公式的结果就会发生变化。您必须了解数据刷新和重新计算之间的区别。请参阅“更新 DAX 公式的结果”一章 - 更新 DAX 公式的结果

数据模型中的数据预计会并且会不时发生变化。这是因为数据用于数据分析活动,这些活动需要在任何时间点获取最新的数据。要了解刷新数据的不同方法,请参阅“更新数据模型中的数据”一章 - 更新数据模型中的数据

您将在“重新计算 DAX 公式”一章中了解不同类型的 DAX 公式重新计算 - 重新计算 DAX 公式

DAX 公式的重新计算需要考虑数据依赖关系并遵循特定的顺序。否则,您可能会遇到错误或错误的结果。有关详细信息,请参阅章节 - DAX 公式重新计算疑难解答

在章节 - DAX 公式错误 中,您将深入了解一些常见的 DAX 公式错误,并学习如何修复这些错误。

DAX 应用场景

如果您开始学习一门新语言,了解在哪里使用什么词汇是熟悉这门语言的最佳方法。同样,DAX 作为一种用于数据分析的公式语言,您需要了解它可以应用于哪些不同的场景。

请参阅以下章节以获取详细信息。

Excel DAX - 计算列

计算列是您通过定义列值的 DAX 公式添加到工作簿数据模型中现有表的一列。您创建计算列,而不是导入列中的值。

您可以像使用任何其他表列一样,在数据透视表、数据透视图、Power Pivot 表、Power Pivot 图或 Power View 报表中使用计算列。

了解计算列

用于创建计算列的 DAX 公式类似于 Excel 公式。但是,在 DAX 公式中,您不能为表中的不同行创建不同的公式。DAX 公式会自动应用于整列。

例如,您可以创建一个计算列,使用 DAX 公式从现有的“日期”列中提取年份 -

= YEAR ([Date]) 

YEAR 是一个 DAX 函数,Date 是表中现有的列。如您所见,表名用方括号括起来。您将在章节 - DAX 语法 中了解更多相关内容。

当您使用此 DAX 公式向表中添加列时,列值将在您创建公式后立即计算。将创建一个新的列,其标题为 CalculatedColumn1,并填充年份值。

列值会在必要时重新计算,例如在刷新基础数据时。您可以根据现有列、计算字段(度量值)和其他计算列创建计算列。

创建计算列

考虑以下屏幕截图中显示的包含奥运会结果的数据模型。

Creating a Calculated Column
  • 单击数据视图。
  • 单击“结果”选项卡。

您将查看“结果”表。

View Result Table

如上图所示,最右侧列的标题为“添加列”。

  • 单击功能区上的“设计”选项卡。
  • 单击“列”组中的“添加”。
Add Column

指针将出现在公式栏中。这意味着您正在使用 DAX 公式添加一列。

  • 在公式栏中键入 =YEAR([Date])。
Pointer in Formula Bar

如上图所示,标题为“添加列”的最右侧列已突出显示。

  • 按 Enter 键。

计算需要一段时间(几秒钟)。请等待。

新的计算列将插入到最右侧“添加列”的左侧。

Inserted Calculated Column

如上图所示,新插入的计算列已突出显示。整列中的值根据所使用的 DAX 公式显示。列标题为 CalculatedColumn1。

重命名计算列

要将计算列重命名为有意义的名称,请执行以下操作 -

  • 双击列标题。列名将被突出显示。
Renaming the Calculated Column
  • 选择列名。
  • 键入 Year(新名称)。
Select Column Name and Type Year

如上图所示,计算列的名称已更改。

您也可以通过右键单击列,然后在下拉列表中单击“重命名”来重命名计算列。

只需确保新名称与表中现有的名称不冲突。

检查计算列的数据类型

您可以按如下方式检查计算列的数据类型 -

  • 单击功能区上的“开始”选项卡。
  • 单击“数据类型”。
Checking Data Type

如您在上图中看到的,下拉列表包含列的可能数据类型。在此示例中,已选择默认(自动)数据类型,即整数。

计算列中的错误

计算列中可能由于以下原因而发生错误 -

  • 更改或删除表之间的关系。这是因为使用这些表中列的公式将变得无效。

  • 公式包含循环或自引用依赖关系。

性能问题

如前面奥运会结果示例中所见,“结果”表大约有 35000 行数据。因此,当您使用 DAX 公式创建列时,它会立即计算列中的所有 35000 多个值,这需要花费一些时间。数据模型和表旨在处理数百万行数据。因此,当 DAX 公式包含太多引用时,它可能会影响性能。您可以通过执行以下操作来避免性能问题 -

  • 如果您的 DAX 公式包含许多复杂的依赖关系,则将其分步骤创建,并将结果保存在新的计算列中,而不是一次创建单个大型公式。这使您能够验证结果并评估性能。

  • 数据修改发生时,需要重新计算计算列。您可以将重新计算模式设置为手动,从而节省频繁的重新计算。但是,如果计算列中的任何值不正确,则该列将显示为灰色,直到您刷新并重新计算数据。

Excel DAX - 计算字段/度量值

数据模型中表中的计算字段是通过 DAX 公式获得的字段。在早期版本的 Power Pivot 中,计算字段被称为度量值。在 Excel 2013 中,它被重命名为计算字段。但是,在 Excel 2016 中它被重新命名回度量值。如果您参考任何文档,您可能会观察到这两个术语的混淆。请注意,术语“计算字段”和“度量值”是同义词。在本教程中,我们使用术语“计算字段”。

了解计算字段

计算字段是专门为在数据透视表(或数据透视图)中使用而创建的公式。

您可以根据标准聚合函数(如 COUNT 或 SUM)创建计算字段,或者通过定义您自己的 DAX 公式来创建计算字段。

以下是计算字段和计算列之间的区别 -

  • 计算字段只能用于数据透视表的“值”区域。

  • 包含计算结果的计算列也可以用于“行”、“列”和“筛选器”区域。

保存计算字段

计算字段将与其源表一起保存在数据模型中。它在 Power Pivot 表或 Power Pivot 图字段列表中显示为表中的字段。

使用计算字段

要使用计算字段,您必须从 Power Pivot 表字段列表中选择它。计算字段将添加到“值”区域,并将评估用于计算字段的公式。将为每一行和列字段组合创建结果。

计算字段 - 示例

考虑以下奥运会数据的 Data Model -

Calculated Field

如上图所示,“结果”表有一个“奖牌”字段,其中包含“金牌”、“银牌”或“铜牌”的值,每个值对应包含“运动” - “项目” - “国家/地区” - “日期”组合的行。假设您想要每个国家的奖牌数量,那么您可以创建一个计算字段“奖牌数量”,并使用以下 DAX 公式 -

Medal Count := COUNTA([Medal])

在表中创建计算字段

要在“结果”表中创建计算字段“奖牌数量”,请执行以下操作 -

  • 单击“结果”表中“奖牌”列下方计算区域中的单元格。该单元格将被突出显示。

  • 在公式栏中键入 Medal Count:=COUNTA([Medal])。

Creating a Calculated Field in a Table

按 Enter 键。

Press Enter

如上图所示,计算字段显示在选定的单元格中,显示值为 34,094。此数字是“结果”表中的总行数。因此,乍一看它没有多大意义。如前所述,计算字段的真正用途只有通过将其添加到 Power Pivot 表或 Power Pivot 图中才能看到。

在 Power Pivot 表中使用计算字段

要使用计算字段计算每个国家的奖牌数量,请执行以下操作 -

  • 在 Power Pivot 窗口中单击功能区上的“数据透视表”。
  • 在下拉列表中单击“数据透视表”。
Using the Calculated Field in a Power PivotTable

出现“创建数据透视表”对话框。

  • 单击“现有工作表”。
  • 选择要放置数据透视表的位置。

将创建一个空数据透视表。

  • 单击“数据透视表字段”列表中的“结果”表。
  • 单击字段 - “国家/地区”和“奖牌数量”。
Empty PivotTable Created

如您所观察到的,“奖牌数量”已添加到“值”区域,“国家/地区”已添加到“行”区域。数据透视表已创建,行中显示字段“国家/地区”的值。并且对于每一行,都会计算和显示“奖牌数量”值。这就是计算字段评估所使用的 DAX 公式并显示值的方式。

  • 将“结果”表中的“运动”字段添加到“行”区域。
Add the Field Sport

如您在上图中看到的,已按国家/地区和运动计算“奖牌数量”,并且还显示了国家/地区的子总数。

这就是 DAX 如何补充 Power 功能的方式。

计算字段的类型

计算字段有两种类型 - 隐式和显式。

  • 隐式计算字段是在 Power Pivot 表字段列表窗格中创建的。

  • 显式计算字段是在 Power Pivot 窗口中的表中创建的,或者是在 Excel 窗口中的 PowerPivot 功能区中创建的。

创建隐式计算字段

隐式计算字段可以通过两种方式创建,这两种方式都在 Power Pivot 表字段窗格中。

在数据透视表字段列表中创建隐式计算字段

您可以按如下方式从“数据透视表字段”列表中的“奖牌”字段创建“奖牌计数”字段 -

  • 取消选中“奖牌数量”字段。
  • 右键单击“奖牌”字段。
  • 在下拉列表中单击“添加到值”。
Creating an Implicit Calculated Field

“奖牌计数”出现在“值”区域中。“奖牌计数”列将添加到数据透视表中。

Medal column Count

在“值”区域中创建隐式计算字段

您可以在“值”区域中创建隐式计算字段 - “父行百分比”,以表示每个国家/地区赢得的每项运动的奖牌数量占该国家/地区赢得的总奖牌数量的百分比。

  • 单击“值”区域中“奖牌计数”框中的向下箭头。

  • 在下拉列表中点击“数值字段设置”。
Creating an Implicit Calculated Field in Values Area

“数值字段设置”对话框出现。

  • 在“自定义名称”框中输入“% Medals”。
  • 点击“显示数值方式”选项卡。
  • 点击“显示数值方式”下的框。
  • 点击“父行总计的百分比”。
Value Field Settings
  • 点击“数字格式”按钮。

“设置单元格格式”对话框出现。

  • 点击“百分比”。
  • 在小数位数中输入“0”。
  • 点击“确定”。
  • 在“数值字段设置”对话框中点击“确定”。
  • 选择“不显示小计”。
Format Cells Dialog Box

您创建了另一个隐式计算字段“% Medals”,并且您可以观察到,对于每个国家/地区,都显示了按运动项目计算的奖牌百分比。

隐式计算字段的缺点

隐式计算字段易于创建。事实上,您甚至在 Excel 数据透视表和数据透视图表中一直在创建它们。但是,它们具有以下缺点:

  • 它们是易失性的。这意味着,如果您取消选择用于计算字段的字段,它将被删除。如果您想再次显示它,则必须再次创建它。

  • 它们的范围仅限于创建它们的数 据透视表或数据透视图表。如果您在另一个工作表中创建另一个数据透视表,则必须再次创建计算字段。

另一方面,显式计算字段将与表一起保存,并在您选择该表时可用。

创建显式计算字段

您可以通过两种方式创建显式计算字段:

  • 在数据模型中表的计算区域中。您已经在“在表中创建计算字段”部分学习了这一点。

  • 从 Excel 表格中的 PowerPivot 功能区。您将在下一节中学习这种创建显式计算字段的方法。

从 PowerPivot 功能区创建显式计算字段

要从 PowerPivot 功能区创建显式计算字段,请执行以下操作:

  • 在工作簿的 Ribbon 中点击“POWERPIVOT”选项卡。
  • 点击“计算”区域中的“计算字段”。
  • 点击下拉列表中的“新建计算字段”。
Creating an Explicit Calculated

“计算字段”对话框出现。

  • 填写以下屏幕截图中所示的必要信息。
Calculated Field dialog box
  • 点击“检查公式”按钮。
  • 仅当公式中没有错误时才点击“确定”。

您可以观察到,您可以在此对话框中定义计算字段的类别和格式。此外,您可以使用 IntelliSense 功能来了解函数的使用方法,并使用自动完成功能轻松完成函数、表和列的名称。有关 IntelliSense 功能的详细信息,请参阅“DAX 公式”章节 – DAX Formulas

这是创建显式计算字段的推荐方法。

Excel DAX - 编辑计算字段

您可以编辑计算字段以修改它。但是,在编辑计算字段之前,您应该知道它存储在哪里。这意味着,计算字段存储在哪个表中。这对于隐式和显式计算字段都适用。计算字段只能与数据模型中的一个表关联。

查找计算字段

要在数据模型中查找计算字段,请执行以下操作:

  • 在 Power Pivot 窗口的 Ribbon 中点击“高级”选项卡。
  • 点击“显示隐式计算字段”。
Finding Calculated Fields
  • 点击“图表视图”。
Click the Diagram View

如您在上面的屏幕截图中看到的,“显示隐式计算字段”在 Ribbon 上突出显示。如果它没有突出显示,请再次点击它。

您还可以观察到有 4 个复选框 - 列、计算字段、层次结构和 KPI。默认情况下,所有 4 个都已选中。

  • 取消选中“列”、“层次结构”和“KPI”框。

这将只保留“计算字段”框选中。

Calculated Fields box checked

如上图所示,只有“结果”表显示了字段。其他两个表是空白的。这表明只有“结果”表具有计算字段。您还可以观察到,隐式计算字段显示了一个图标 Implicit Calculated Fields Icon,而显式计算字段“奖牌计数”没有该图标。

在表中查看计算字段

您可以按如下方式在表中查看计算字段:

  • 点击计算字段。
  • 右键点击并选择下拉列表中的“转到”。
Viewing Calculated Fields in the Table

该表将显示在数据视图中。

Data View

如上图所示,计算字段显示在表的计算区域中。

更改表中的计算字段

您可以在表中更改用于计算字段的公式。

  • 点击数据模型数据视图中表中的计算字段。
  • 选择公式栏中的公式 - 在 := 的右侧。

公式将突出显示。

Formula Highlighted
  • 输入新公式。
  • 按 Enter 键。

您将在后续章节中详细了解 DAX 公式。

重命名数据模型中的计算字段

您可以在数据表中通过数据视图或图表视图更改计算字段的名称。

在数据视图中重命名计算字段

  • 点击数据模型数据视图中表中的计算字段。
  • 选择公式栏中的计算字段名称 - 在 := 的左侧。

计算字段名称将突出显示。

Field Name Highlighted
  • 输入计算字段的新名称。
  • 按 Enter 键。

您将在后续章节中详细了解 DAX 语法。

在图表视图中重命名计算字段

  • 右键点击图表视图中表中的计算字段名称。
  • 点击下拉列表中的“重命名”。
Renaming a Calculated Field in the Diagram View

名称将进入编辑模式。输入计算字段的新名称。

在 Excel 窗口中查看计算字段

您可以按如下方式在 Excel 窗口中查看计算字段:

  • 点击 Ribbon 上的“POWERPIVOT”选项卡。
  • 点击“计算”组中的“计算字段”。
  • 点击下拉列表中的“管理计算字段”。
Viewing Calculated Fields in the Excel Window

“管理计算字段”对话框出现。数据模型中显式计算字段的名称将显示在对话框中。

Manage Calculated Fields dialog box

更改“管理计算字段”中的计算字段

您可以在“管理计算字段”对话框中更改计算字段。

  • 点击“奖牌计数”。
  • 点击“编辑”按钮。
Changing a Calculated Field in the Manage Calculated Fields

“计算字段”对话框出现。

  • 选择公式框中 = 右侧的公式。
Calculated Field dialog box Appear
  • 输入新公式。
  • 点击“确定”。
  • 点击“管理计算字段”对话框中的“关闭”。

重命名“管理计算字段”中的计算字段

您可以在“管理计算字段”对话框中重命名计算字段。

  • 点击“奖牌计数”。
  • 点击“编辑”按钮。

“计算字段”对话框出现。

  • 选择计算字段名称框中的名称。
Renaming a Calculated Field in the Manage Calculated Fields
  • 输入计算字段的新名称。
  • 点击“确定”。
  • 点击“管理计算字段”对话框中的“关闭”。

在数据模型中移动计算字段

您可以在创建它的表的计算区域内移动计算字段。但是,它不能移动到另一个表。

  • 右键点击计算字段。
  • 点击“剪切”。
  • 将指针移动到同一表计算区域中的不同位置。
  • 点击“粘贴”。

注意 - 计算字段在表的计算区域中的位置实际上并不重要,因为计算字段的 DAX 公式中的数据引用是按列名进行的,并且是明确说明的。

Excel DAX - 删除计算字段

您可以删除显式和隐式计算字段。本章将介绍几种执行此操作的方法。

但是,在删除计算字段之前,您需要记住以下几点:

  • 显式计算字段可以在多个数据透视表和/或数据透视图表中使用。因此,您需要确保删除显式计算字段不会影响您已生成的任何报表。

  • 显式计算字段可以在其他显式计算字段的计算中使用。因此,您需要确保显式计算字段未在任何其他显式计算字段的计算中使用。

  • 隐式计算字段仅限于使用它的数据透视表或数据透视图表。因此,在删除隐式计算字段之前,只需确保可以从相应的数据透视表或数据透视图表中删除它即可。

  • 创建隐式计算字段比创建显式计算字段更简单。因此,在删除显式计算字段之前需要更加谨慎。

  • 如果名称与隐式计算字段的名称冲突,则无法创建显式计算字段。因此,您可能需要在创建显式计算字段之前删除该隐式计算字段。

删除数据模型中的显式计算字段

您可以在数据模型的数据视图或图表视图中删除显式计算字段。

在数据视图中删除显式计算字段

  • 在数据视图的计算区域中找到计算字段。
  • 右键点击计算字段。
  • 点击下拉列表中的“删除”。
Deleting an Explicit Calculated Field in the Data View

出现删除确认消息。

Delete Confirmation

点击“从模型中删除”。显式计算字段将被删除。

在图表视图中删除显式计算字段

  • 在图表视图中找到数据表中的计算字段。
  • 右键点击计算字段名称。
  • 点击下拉列表中的“删除”。
Deleting an Explicit Calculated Field in the Diagram View

出现删除确认消息。

Message Appears

点击“从模型中删除”。显式计算字段将被删除,并且在数据表的字段列表中将看不到它。

在 Excel 窗口中删除显式计算字段

您可以按如下方式从 Excel 窗口中删除显式计算字段:

  • 点击 Ribbon 上的“POWERPIVOT”选项卡。
  • 点击“计算”组中的“计算字段”。
  • 点击下拉列表中的“管理计算字段”。
Deleting an Explicit Calculated Field in the Excel Window

“管理计算字段”对话框出现。

  • 点击显式计算字段名称。
  • 点击“删除”按钮。
Manage Calculated Fields Dialog Box Appear

出现删除确认消息。

Manage Calculated Fields Dialog
  • 点击“是”。顶部会出现一条数据模型已更改的信息消息。
  • 点击对话框中的“关闭”按钮。
Change Data Model

显式计算字段将被删除,并且在工作簿中的数据透视表/数据透视图表字段列表中将看不到它。

删除隐式计算字段

您可以在数据模型的数据视图或图表视图中删除隐式计算字段。

在数据视图中删除隐式计算字段

  • 在数据视图的计算区域中找到计算字段。
  • 右键点击计算字段。
  • 点击下拉列表中的“删除”。
Deleting an Implicit Calculated Field in the Data View

出现删除确认消息。

Implicit Calculated Field Delete Confirmation
  • 点击“从模型中删除”。隐式计算字段将被删除。

在图表视图中删除隐式计算字段

  • 在图表视图中找到数据表中的计算字段。
  • 右键点击计算字段名称。
  • 点击下拉列表中的“删除”。
Deleting an Implicit Calculated Field in the Diagram View

出现删除确认消息。

Deleting an Implicit Calculated Field Confirmation

点击“从模型中删除”。隐式计算字段将被删除,并且在数据表的字段列表中将看不到它。

Excel DAX - 语法

如前所述,DAX 是一种公式语言,包含运算符、值、函数和公式。在本章中,您将了解 DAX 语法。

DAX 语法可以归类为:

在开始学习 DAX 语法之前,您必须了解 Excel 公式和 DAX 公式之间的区别。

Excel 公式和 DAX 公式的区别

DAX 公式与 Excel 公式类似,您可以在公式栏中输入它们。但是,两者之间存在一些重要区别。

Excel 公式 DAX 公式

Excel 公式是在 Excel 窗口的公式栏中输入的。

DAX 公式是在 Power Pivot 窗口的公式栏中输入的。

在 Excel 公式中,您可以引用单个单元格或数据数组。

在 DAX 公式中,您只能引用完整的数据表或列,即引用只能指向表和表中的字段。

但是,如果您需要仅对列数据的一部分执行计算,则可以使用筛选并提供所需唯一数据值进行计算的 DAX 函数。

Excel 公式支持某些数据类型。

DAX 提供的数据类型比 Excel 多。因此,DAX 公式也可以使用其他数据类型。

Excel 不支持任何隐式数据转换。

DAX 在计算期间执行隐式数据类型转换。

Excel DAX - 运算符

DAX 是一种公式语言,包含函数、运算符和值,这些函数、运算符和值可用于公式或表达式中,以计算和返回一个或多个值。

您可以使用DAX 运算符来比较值、执行算术计算和连接字符串。在本节中,您将了解 DAX 运算符及其使用方法。

DAX 运算符的类型

DAX 支持以下类型的运算符:

DAX 运算符优先级顺序

您的 DAX 公式可以包含许多 DAX 运算符,这些运算符组合多个值或表达式。在这种情况下,最终结果将取决于执行操作的顺序。DAX 为您提供了默认的运算符优先级顺序,以及覆盖默认优先级顺序的方法。

DAX 默认运算符优先级在以下表格中列出。

优先级顺序 运算符 操作
1 ^ 求幂
2 符号
3 * 和 / 乘法和除法
4 ! NOT
5 + 和 – 加法和减法
6 & 连接
7 =, <, >, <=, >= 和 <> 等于、小于、大于、小于等于、大于等于和不等于

DAX 表达式语法

您需要首先了解 DAX 表达式语法以及如何使用操作数和运算符进行表达式求值。

  • 所有表达式都以等号 (=) 开头。等号表示后续字符构成表达式。

  • 在等号右侧,您将拥有由 DAX 运算符连接的操作数。例如,= 5 + 4 > 5。

    = 5 * 6 - 3.

  • 表达式始终从左到右读取,并且根据上一节中给出的 DAX 运算符优先级按该顺序进行计算。

  • 如果 DAX 运算符具有相同的优先级值,则它们从左到右进行计算。例如,=5*6/10。* 和 / 具有相同的优先级顺序。因此,表达式的计算结果为 30/10 = 3。

  • 如果表达式中的 DAX 运算符具有不同的优先级值,则它们将按从左到右的优先级顺序进行计算。

    • = 5 + 4 > 7。默认优先级是 + 优先,然后是 >。因此,表达式从左到右计算。- 5 + 4 首先计算,结果为 9,然后计算 9 > 5,结果为 TRUE。

    • = 5 * 6 - 3。默认优先级是 * 优先,然后是 -。因此,表达式从左到右计算。- 5 * 6 首先计算,结果为 30,然后计算 30 - 3,结果为 27。

    • = 2 * 5 - 6 * 3。默认优先级是 * 优先,然后是 *,最后是 -。因此,表达式的计算结果为 10 – 18,然后为 -8。请注意,它不是 10 - 6,结果为 4,然后 4*3,结果为 12。

使用括号控制 DAX 计算顺序

您可以通过使用括号更改 DAX 默认运算符优先级顺序,对操作数和运算符进行分组以控制计算顺序。

例如,= 5 * 6 - 3 使用 DAX 默认运算符优先级顺序计算结果为 27。如果使用括号对操作数和运算符进行分组,如 = 5 * (6 - 3),则首先计算 6 - 3,结果为 3,然后计算 5 * 3,结果为 15。

= 2 * 5 - 6 * 3 使用 DAX 默认运算符优先级顺序计算结果为 -8。如果使用括号对操作数和运算符进行分组,如 = 2 * (5 - 6) * 3,则首先计算 5 - 6,结果为 -1,然后计算 2 * (-1) * 3,结果为 -6。

如您所见,使用相同的操作数和运算符,通过不同的分组方式可以得到不同的结果。因此,当您在 DAX 公式中使用 DAX 运算符时,应注意计算顺序。

Excel 和 DAX 的区别

尽管 DAX 与 Excel 公式有相似之处,但两者之间存在一些显着差异。

  • 由于其底层内存驻留计算引擎,DAX 比 Excel 更强大。

  • DAX 支持的数据类型比 Excel 多。

  • DAX 提供了关系数据库数据模型的其他高级功能,包括对日期和时间类型的更丰富的支持。

在某些情况下,DAX 中计算的结果或函数的行为可能与 Excel 中的不同。这是由于以下差异造成的:

  • 数据类型转换
  • 数据类型

数据类型转换的差异

在 DAX 中,当您有一个表达式 =value1 operator value2 时,两个操作数 value1 和 value2 应具有相同的数据类型。如果数据类型不同,DAX 将首先隐式地将它们转换为通用数据类型。有关详细信息,请参阅章节 – DAX 语法。

例如,您必须比较两个不同数据类型的操作数,例如公式产生的数字,例如 =[Amount] * 0.08 和一个整数。第一个数字可以是小数点后有多位小数的十进制数,而第二个数字是整数。然后 DAX 处理如下:

  • 首先,DAX 将使用可以存储这两种数字的最大数字格式将两个操作数都转换为实数。

  • 接下来,DAX 将比较这两个实数。

相反,Excel 尝试比较不同数据类型的值,而无需首先将它们强制转换为通用数据类型。因此,您可能会发现对于相同的比较表达式,DAX 和 Excel 中的结果不同。

数据类型的差异

DAX 和 Excel 中的运算符优先级顺序相同。但是,Excel 支持的运算符百分比 (%) 和数据范围不受 DAX 支持。此外,DAX 支持表作为数据类型,而 Excel 中则没有。

此外,在 Excel 公式中,您可以引用单个单元格、数组或单元格范围。在 DAX 公式中,您不能引用任何这些。DAX 公式对数据的引用应通过表、列、计算字段和计算列进行。

如果您从 Excel 中复制公式并将其粘贴到 DAX 中,请确保 DAX 公式的正确性,因为 DAX 语法与 Excel 公式语法不同。此外,即使某个函数在 DAX 和 Excel 中具有相同的名称,其参数也可能不同,函数的结果也可能不同。

您将在后续章节中详细了解所有这些内容。

Excel DAX - 标准参数

DAX 具有标准参数名称,以方便使用和理解 DAX 函数。此外,您可以在参数名称前使用某些前缀。如果前缀足够清晰,您可以使用前缀本身作为参数名称。

标准参数名称

以下是 DAX 标准参数名称:

序号 参数名称和说明
1

expression

任何返回单个标量值的 DAX 表达式,其中表达式将被多次求值(对于每一行/上下文)。

2

value

任何返回单个标量值的 DAX 表达式,其中表达式将在所有其他操作之前恰好求值一次。

3

table

任何返回数据表的 DAX 表达式。

4

tableName

使用标准 DAX 语法的现有表的名称。它不能是表达式。

5

columnName

使用标准 DAX 语法的现有列的名称,通常是完全限定的。它不能是表达式。

6

name

一个字符串常量,将用于提供新对象的名称。

7

order

用于确定排序顺序的枚举。

8

ties

用于确定如何处理关联值的枚举。

9

type

用于确定 PathItem 和 PathItemReverse 的数据类型的枚举。

参数名称前缀

您可以使用前缀限定参数名称:

  • 前缀应描述参数的使用方式。

  • 前缀应以避免参数的歧义读取的方式。

例如,

  • Result_ColumnName - 指的是用于在 DAX LOOKUPVALUE() 函数中获取结果值的现有列。

  • Search_ColumnName - 指的是用于在 DAX LOOKUPVALUE() 函数中搜索值的现有列。

仅使用前缀作为参数

如果前缀足以描述参数,则可以省略参数名称并仅使用前缀。有时,省略参数名称并仅使用前缀可以帮助避免读取时出现混乱。

例如,考虑 DATE (Year_value, Month_value, Day_value)。您可以省略重复三次的参数名称 – value,并将其写成 DATE (Year, Month, Day)。如您所见,仅使用前缀可以使函数更易读。

但是,有时为了清晰起见,必须同时使用参数名称和前缀。

例如,考虑 Year_columnName。参数名称为 ColumnName,前缀为 Year。两者都需要让用户了解参数需要对年份的现有列进行引用。

Excel DAX - 函数

大多数DAX 函数与 Excel 函数具有相同的名称和功能。但是,DAX 函数已被修改为使用 DAX 数据类型并与表和列一起使用。

DAX 有一些您在 Excel 中找不到的附加函数。这些 DAX 函数是为了特定目的而提供的,例如基于与数据模型的关系数据库方面相关联的关系执行查找、能够迭代表以执行递归计算、执行动态聚合以及用于利用时间智能的计算。

在本节中,您将了解 DAX 语言支持的函数。有关这些 DAX 函数用法的更多信息,请参阅本教程库中的教程 – DAX 函数。

什么是 DAX 函数?

DAX 函数是 DAX 语言内置的函数,用于在数据模型中的表格数据上执行各种操作。如前所述,DAX 用于数据分析和商业智能目的,需要支持从数据中提取、整合和得出见解。基于数据模型的 DAX 函数为您提供了这些实用程序,使您的工作更简单,一旦您掌握了 DAX 语言和 DAX 函数的使用方法。

Excel 函数与 DAX 函数

您所了解的 Excel 函数与 DAX 函数之间存在一些相似之处。但是,也存在一些差异。您需要了解这些差异,以便避免在使用 DAX 函数以及编写包含 DAX 函数的 DAX 公式时出错。

Excel 函数和 DAX 函数之间的相似之处

  • 许多 DAX 函数与 Excel 函数具有相同的名称和相同的总体行为。

  • DAX 具有查找函数,类似于 Excel 中的数组和向量查找函数。

Excel 函数和 DAX 函数之间的差异

  • DAX 函数已被修改以采用不同类型的输入,并且某些 DAX 函数可能会返回不同的数据类型。因此,即使它们具有相同的名称,您也需要分别了解这些函数的使用方法。在本教程中,您会发现每个 DAX 函数都以 DAX 为前缀,以避免与 Excel 函数混淆。

  • 您不能在 Excel 公式中使用 DAX 函数,也不能在 DAX 中使用 Excel 公式/函数,除非进行了必要的修改。

  • Excel 函数以单元格引用或单元格范围作为引用。DAX 函数从不以单元格引用或单元格范围作为引用,而是以列或表作为引用。

  • Excel 日期和时间函数返回一个整数,表示日期作为序列号。DAX 日期和时间函数返回 DAX 中的 datetime 数据类型,而在 Excel 中则没有。

  • Excel 没有返回表的函数,但某些函数可以与数组一起使用。许多 DAX 函数可以轻松引用完整的表和列来执行计算,并返回一个表或一列值。DAX 的此功能增强了 Power Pivot、Power View 和 Power BI 的功能,DAX 在其中得到使用。

  • DAX 查找函数要求在表之间建立关系。

  • Excel 在数据列中支持变体数据类型,即您可以在一列中拥有不同数据类型的数据。而 DAX 期望表中一列中的数据始终为相同的数据类型。如果数据不是相同的数据类型,DAX 会将整列更改为最适合列中所有值的类型。但是,如果数据是导入的并且出现此问题,DAX 可能会标记错误。

要了解 DAX 数据类型和数据类型转换,请参阅“DAX 语法参考”一章。

DAX 函数的类型

DAX 支持以下类型的函数。

  • DAX 表值函数
    • DAX 筛选函数
    • DAX 聚合函数
    • DAX 时间智能函数
  • DAX 日期和时间函数
  • DAX 信息函数
  • DAX 逻辑函数
  • DAX 数学和三角函数
  • DAX 其他函数
  • DAX 父子函数
  • DAX 统计函数
  • DAX 文本函数

在本节中,您将学习按函数类别级别的 DAX 函数。有关 DAX 函数语法以及 DAX 函数返回和执行的操作的详细信息,请参阅本教程库中的 DAX 函数教程。

DAX 时间智能函数和 DAX 筛选函数功能强大,需要特别提及。有关详细信息,请参阅“了解 DAX 时间智能”和“DAX 筛选函数”章节。

DAX 表值函数

许多 DAX 函数将表作为输入或输出表,或同时执行这两项操作。这些 DAX 函数称为 DAX 表值函数。因为表可以具有单列,所以 DAX 表值函数也采用单列作为输入。您有以下类型的 DAX 表值函数:

  • DAX 聚合函数
  • DAX 筛选函数
  • DAX 时间智能函数

了解 DAX 表值函数有助于您有效地编写 DAX 公式。

DAX 聚合函数

DAX 聚合函数聚合表行上的任何表达式,并在计算中很有用。

以下是一些 DAX 聚合函数:

  • ADDCOLUMNS (<table>, <name>, <expression>, [<name>, <expression>] …)

  • AVERAGE (<column>)

  • AVERAGEA (<column>)

  • AVERAGEX (<table>, <expression>)

  • COUNT (<column>)

  • COUNTA (<column>)

  • COUNTAX (<table>, <expression>)

  • COUNTBLANK (<column>)

  • COUNTROWS (<table>)

  • COUNTX (<table>, <expression>)

  • CROSSJOIN (<table1>, <table2>, [<table3>] …)

  • DISTINCTCOUNT (<column>)

  • GENERATE (<table1>, <table2>)

  • GENERATEALL (<table1>, <table2>)

  • MAX (<column>)

  • MAXA (<column>)

  • MAXX (<table>, <expression>)

  • MIN (<column>)

  • MINA (<column>)

  • MINX (<table>, <expression>)

  • PRODUCT (<column>)

  • PRODUCTX (<table>, <expression>)

  • ROW (<name>, <expression>, [<name>, <expression>] …)

  • SELECTCOLUMNS (<table>, <name>, <scalar_expression>,

  • [<name>, <scalar_expression>] …)

  • SUM (<column>)

  • SUMMARIZE (<table>, <groupBy_columnName>, [<groupBy_columnName>] …, [<name>, <expression>] …)

  • SUMX (<table>, <expression>)

  • TOPN (<n_value>, <table>, <orderBy_expression>, [<order>], [<orderBy_expression>, [<order>]] …)

DAX 筛选函数

DAX 筛选函数返回与当前行相关的列、表或值。您可以使用 DAX 筛选函数返回特定数据类型、在相关表中查找值以及按相关值筛选。DAX 查找函数通过使用表以及它们之间的关系来工作。DAX 筛选函数使您能够操纵数据上下文以创建动态计算。

以下是一些 DAX 筛选函数:

  • ADDMISSINGITEMS(<showAllColumn>, [<showAllColumn>] …, <table>, <groupingColumn>, [<groupingColumn>] … [filterTable] …)

  • ALL( {<table> | <column>, [<column>], [<column>] …} )

  • ALLEXCEPT(<table>, <column>, [<column>] …)

  • ALLNOBLANKROW(<table>|<column>)

  • ALLSELECTED([<tableName> | <columnName>])

  • CALCULATE (<expression>, <filter1>, <filter2>…)

  • CALCULATETABLE (<expression>, <filter1>, <filter2>…)

  • CROSSFILTER (<columnName1>, <columnName2>, <direction>)

  • DISTINCT (<column>)

  • EARLIER(<column>, <number>)

  • EARLIEST(<column>)

  • FILTER(<table>,<filter>)

  • FILTERS(<columnName>)

  • HASONEFILTER(<columnName>)

  • HASONEVALUE(<columnName>)

  • ISCROSSFILTERED (<columnName>)

  • ISFILTERED (<columnName>)

  • KEEPFILTERS (<expression>)

  • RELATED(<column>)

  • RELATEDTABLE(<tableName>)

  • SUBSTITUTEWITHINDEX (<table>, <indexColumnName>, <indexColumnsTable>, <orderBy_expression>, [<order>], [<orderBy_expression>, [<order>]] …])

  • USERELATIONSHIP(<columnName1>,<columnName2>)

  • VALUES(<TableNameOrColumnName>)

DAX 时间智能函数

DAX 时间智能函数返回日期表或使用日期表来计算聚合。这些 DAX 函数通过使您能够使用时间段(包括天、月、季度和年)来操作数据,帮助您创建支持商业智能分析需求的计算。

以下是一些 DAX 时间智能函数:

  • CLOSINGBALANCEMONTH (<expression>,<dates>[,<filter>])

  • CLOSINGBALANCEQUARTER (<expression>,<dates>, [<filter>])

  • CLOSINGBALANCEYEAR (<expression>,<dates>, [<filter>], [<year_end_date>])

  • DATEADD (<dates>,<number_of_intervals>, <interval>)

  • DATESBETWEEN (<dates>,<start_date>,<end_date>)

  • DATESINPERIOD (<dates>,<start_date>, <number_of_intervals>,<interval>)

  • DATESMTD (<dates>)

  • DATESQTD (<dates>)

  • DATESYTD (<dates>, [<year_end_date>])

  • ENDOFMONTH (<dates>)

  • ENDOFQUARTER (<dates>)

  • ENDOFYEAR (<dates> , [<year_end_date>])

  • FIRSTDATE (<dates>)

  • FIRSTNONBLANK (<column>,<expression>)

  • LASTDATE (<dates>)

  • LASTNONBLANK (<column>,<expression>)

  • NEXTDAY (<dates>)

  • NEXTMONTH (<dates>)

  • NEXTQUARTER (<dates>)

  • NEXTYEAR (<dates>, [<year_end_date>])

  • OPENINGBALANCEMONTH (<expression>,<dates>, [<filter>])

  • OPENINGBALANCEQUARTER (<expression>,<dates>, [<filter>])

  • OPENINGBALANCEYEAR (<expression>,<dates>, [<filter>], [<year_end_date>])

  • PARALLELPERIOD (<dates>,<number_of_intervals>, <interval>)

  • PREVIOUSDAY(<dates>)

  • PREVIOUSMONTH(<dates>)

  • PREVIOUSQUARTER(<dates>)

  • PREVIOUSYEAR (<dates>, [<year_end_date>])

  • SAMEPERIODLASTYEAR(<dates>)

  • STARTOFMONTH(<dates>)

  • STARTOFQUARTER(<dates>)

  • STARTOFYEAR(<dates>)

  • TOTALMTD (<expression>,<dates>, [<filter>])

  • TOTALQTD(<expression>,<dates>, [<filter>])

  • TOTALYTD(<expression>,<dates>, [<filter>], [<year_end_date>])

DAX 日期和时间函数

DAX 日期和时间函数类似于 Excel 日期和时间函数。但是,DAX 日期和时间函数基于 DAX 的 datetime 数据类型。

以下是一些 DAX 日期和时间函数:

  • DATE(<year>, <month>, <day>)
  • DATEVALUE(date_text)
  • DAY(<date>)
  • EDATE(<start_date>, <months>)
  • EOMONTH(<start_date>, <months>)
  • HOUR(<datetime>)
  • MINUTE(<datetime>)
  • MONTH(<datetime>)
  • NOW()
  • SECOND(<time>)
  • TIME(hour, minute, second)
  • TIMEVALUE(time_text)
  • TODAY()
  • WEEKDAY(<date>, <return_type>)
  • WEEKNUM(<date>, <return_type>)
  • YEAR(<date>)
  • YEARFRAC(<start_date>, <end_date>, <basis>)

DAX 信息函数

DAX 信息函数查看作为参数提供的单元格或行,并告诉您值是否与预期类型匹配。

以下是一些 DAX 信息函数:

  • CONTAINS (<table>, <columnName>, <value>, [<columnName>, <value>]…)

  • CUSTOMDATA()

  • ISBLANK(<value>)

  • ISERROR(<value>)

  • ISEVEN(number)

  • ISLOGICAL(<value>)

  • ISNONTEXT(<value>)

  • ISNUMBER(<value>)

  • ISONORAFTER (<scalar_expression>, <scalar_expression>, [sort_order], [<scalar_expression>, <scalar_expression>, [sort_order]]…)

  • ISTEXT(<value>)

  • LOOKUPVALUE (<result_columnName>, <search_columnName>, <search_value>, [<search_columnName>, <search_value>]…)

  • USERNAME()

DAX 逻辑函数

DAX 逻辑函数返回有关表达式中值的的信息。例如,DAX TRUE 函数让您知道您正在评估的表达式是否返回 TRUE 值。

以下是一些 DAX 逻辑函数:

  • AND(<logical1>,<logical2>)
  • FALSE()

  • IF(逻辑测试>,<如果为真时的值>, 如果为假时的值)
  • IFERROR(值, 如果出错时的值)
  • NOT(<逻辑值>)
  • OR(<逻辑值1>,<逻辑值2>)
  • SWITCH(<表达式>, <值>, <结果>, [<值>, <结果>]…, [<其他>])
  • TRUE()

DAX 数学和三角函数

DAX 数学和三角函数与 Excel 数学和三角函数非常相似。

以下是一些 DAX 数学和三角函数 -

  • ABS(<数字>)
  • ACOS(数字)
  • ACOSH(数字)
  • ASIN(数字)
  • ASINH(数字)
  • ATAN(数字)
  • ATANH(数字)
  • CEILING(<数字>, <基数>)
  • COMBIN(数字, 选取的数字)
  • COMBINA(数字, 选取的数字)
  • COS(数字)
  • COSH(数字)
  • CURRENCY(<值>)
  • DEGREES(角度)
  • DIVIDE(<分子>, <分母>, [<备选结果>])
  • EVEN(数字)
  • EXP(<数字>)
  • FACT(<数字>)
  • FLOOR(<数字>, <基数>)
  • GCD(数字1, [数字2], ...)
  • INT(<数字>)
  • ISO.CEILING(<数字>, [<基数>])
  • LCM(数字1, [数字2], ...)
  • LN(<数字>)
  • LOG(<数字>,<底数>)
  • LOG10(<数字>)
  • INT(<数字>)
  • MROUND(<数字>, <倍数>)
  • ODD(数字)
  • PI()
  • POWER(<数字>, <幂>)
  • PRODUCT(<列>)
  • PRODUCTX(<表>, <表达式>)
  • QUOTIENT(<分子>, <分母>)
  • RADIANS(角度)
  • RAND()
  • RANDBETWEEN(<下限>,<上限>)
  • ROUND(<数字>, <位数>)
  • ROUNDDOWN(<数字>, <位数>)
  • ROUNDUP(<数字>, <位数>)
  • SIN(数字)
  • SINH(数字)
  • SIGN(<数字>)
  • SQRT(<数字>)
  • SUM(<列>)
  • SUMX(<表>, <表达式>)
  • TAN(数字)
  • TANH(数字)
  • TRUNC(<数字>,<位数>)

DAX 其他函数

这些 DAX 函数执行其他大多数函数所属类别无法定义的唯一操作。

以下是一些 DAX 其他函数 -

  • EXCEPT(<表表达式1>, <表表达式2>)

  • GROUPBY (<表>, [<groupBy_列名1>], [<名称>, <表达式>] … )

  • INTERSECT(<表表达式1>, <表表达式2>)

  • ISEMPTY(<表表达式>)

  • NATURALINNERJOIN(<左连接表>, <右连接表>)

  • NATURALLEFTOUTERJOIN(<左连接表>, <右连接表>)

  • SUMMARIZECOLUMNS (<groupBy_列名>, [<groupBy_列名>]…, [<筛选表>] …, [<名称>, <表达式>]…)

  • UNION (<表表达式1>, <表表达式2>, [<表表达式>]…)

  • VAR <名称> = <表达式>

DAX 父子函数

DAX 父子函数在管理数据模型中以父子层次结构呈现的数据方面很有用。

以下是一些 DAX 父子函数 -

  • PATH(<ID_列名>, <父级_列名>)
  • PATHCONTAINS(<路径>, <项目>)
  • PATHITEM(<路径>, <位置>, [<类型>])
  • PATHITEMREVERSE(<路径>, <位置>, [<类型>])
  • PATHLENGTH(<路径>)

DAX 统计函数

DAX 统计函数与 Excel 统计函数非常相似。

以下是一些 DAX 统计函数 -

  • BETA.DIST(x, alpha, beta, cumulative,[A],[B])

  • BETA.INV(probability, alpha, beta,[A],[B])

  • CHISQ.INV(probability, deg_freedom)

  • CHISQ.INV.RT(probability, deg_freedom)

  • CONFIDENCE.NORM(alpha, standard_dev, size)

  • CONFIDENCE.T(alpha, standard_dev, size)

  • DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2 ..., {{Value1, Value2...}, {ValueN, ValueN+1...}...})

  • EXPON.DIST(x, lambda, cumulative)

  • GEOMEAN(<列>)

  • GEOMEANX(<表>, <表达式>)

  • MEDIAN(<列>)

  • MEDIANX(<表>, <表达式>)

  • PERCENTILE.EXC(<列>, <k>)

  • PERCENTILE.INC(<列>, <k>)

  • PERCENTILEX.EXC(<表>, <表达式>, k)

  • PERCENTILEX.EXC(<表>, <表达式>, k)

  • POISSON.DIST(x, mean, cumulative)

  • RANK.EQ(<值>, <列名>[, <顺序>])

  • RANKX(<表>, <表达式>[, <值>[, <顺序>[, <并列>]]])

  • SAMPLE (<n_值>, <表>, <orderBy_表达式>, [<顺序>], [<orderBy_表达式>, [<顺序>]]…)

  • STDEV.P(<列名>)

  • STDEV.S(<列名>)

  • STDEVX.P(<表>, <表达式>)

  • STDEVX.S(<表>, <表达式>)

  • SQRTPI(数字)

  • VAR.P(<列名>)

  • VAR.S(<列名>)

  • VARX.P(<表>, <表达式>)

  • VARX.S(<表>, <表达式>)

  • XIRR(<表>, <值>, <日期>, [猜测])

  • XNPV(<表>, <值>, <日期>, <利率>)

DAX 文本函数

DAX 文本函数可用于表和列。使用 DAX 文本函数,您可以返回字符串的一部分,在字符串中搜索文本或连接字符串值。您还可以控制日期、时间和数字的格式。

以下是一些 DAX 文本函数 -

  • BLANK()
  • CODE(文本)
  • CONCATENATE(<文本1>, <文本2>)
  • CONCATENATEX(<表>, <表达式>, [分隔符])
  • EXACT(<文本1>,<文本2>)
  • FIND(<查找文本>, <查找范围文本>, [<起始位置>], [<未找到时的值>])
  • FIXED(<数字>, <小数位数>, <不显示逗号>)
  • FORMAT(<值>, <格式字符串>)
  • LEFT(<文本>, <字符数>)
  • LEN(<文本>)
  • LOWER(<文本>)
  • MID(<文本>, <起始位置>, <字符数>)
  • REPLACE(<旧文本>, <起始位置>, <字符数>, <新文本>)
  • REPT(<文本>, <重复次数>)
  • RIGHT(<文本>, <字符数>)
  • SEARCH(<查找文本>, <查找范围文本>, [<起始位置>], [<未找到时的值>])
  • SUBSTITUTE(<文本>, <旧文本>, <新文本>, <实例编号>)
  • TRIM(<文本>)
  • UPPER (<文本>)
  • VALUE(<文本>)

Excel DAX - 了解 DAX 函数

在 Excel 2013 中,DAX 有 246 个函数。您已经在“DAX 函数”一章中了解了不同类型的 DAX 函数。但是,如果您必须在 DAX 公式中使用 DAX 函数,则需要详细了解该函数。您应该了解函数的语法、参数类型、函数返回的内容等。

如果您正在编写 DAX 公式,建议在适用时使用 DAX 函数。为此,您可以参考本教程库中的“DAX 函数”教程,深入了解每个 246 个 DAX 函数的使用场景和使用方法。您始终可以在本教程和 DAX 函数教程之间来回切换,以掌握 DAX。

在本节中,您将了解如何阅读和解释 DAX 函数教程中的 DAX 函数。

DAX 函数 - 说明结构

在 DAX 函数教程中,每个 DAX 函数都以标准结构进行解释,包括以下部分 -

  • 描述
  • 语法
  • 参数
  • 返回值
  • 备注
  • 示例

您将在以下部分了解每个部分。

描述

在“描述”部分,您将了解 DAX 函数的功能及其用途。

语法

在“语法”部分,您将了解确切的函数名称和相应的参数。

参数

在“参数”部分,您将了解特定 DAX 函数的每个参数,参数是输入还是输出,以及是否有任何选项。如“DAX 标准参数”一章所示,将仅使用标准参数名称。

返回值

在“返回值”部分,您将了解 DAX 函数将返回什么值及其数据类型。

备注

在“备注”部分,您将了解有关 DAX 函数用法所需了解的任何额外信息。

示例

DAX 函数说明将以函数用法的示例结尾。

Excel DAX - 评估上下文

在 DAX 中,“上下文”是一个重要的术语,在编写 DAX 公式时应了解。DAX 上下文也称为**评估上下文**,用于确定 DAX 公式的评估和相应的结果。这意味着 DAX 公式的结果可能会根据上下文而有所不同。您应该清楚地了解如何使用特定的 DAX 上下文以及结果如何不同。

评估上下文使您能够执行动态分析,其中 DAX 公式的结果可以更改以反映当前行或单元格选择以及任何相关数据。了解上下文并有效地使用上下文对于构建强大的 DAX 公式、执行动态数据分析和解决 DAX 公式中的问题非常重要。评估上下文是 DAX 所有高级功能的基础,您需要掌握这些功能才能创建复杂的数据分析报告。

当您不断引用 DAX 函数以在 DAX 公式中进行相关使用时,您需要参考本章关于 DAX 上下文的介绍,以获得对结果的清晰认识。

DAX 中的上下文类型

DAX 支持以下评估上下文 -

  • 行上下文
  • 筛选上下文

当评估 DAX 公式时,将考虑所有上下文并按相关性应用。上下文一起存在,公式的结果将根据计算值时使用的上下文而有所不同。例如,当您在数据透视表中选择行、列和筛选器字段时,子总数将根据子总数/总数关联的行和列以及行和列中的值动态计算,行和列中的值由使用的筛选器决定。

行上下文

行上下文表示 DAX 公式或 DAX 函数在任何时间点都知道它正在引用表的哪一行。您可以将行上下文视为当前行。公式将逐行计算,并使用行上下文。

某些 DAX 函数(例如 X 函数、FILTER())和所有计算列都具有行上下文。例如,如果您使用 DAX 公式 = YEAR([Date]) 创建一个名为 Year 的计算列,则计算列的值是通过在表中逐行应用给定的 DAX 公式获得的,并应用于给定的列。

这意味着,如果您创建了一个计算列,则行上下文将包含每一行的值以及与当前行相关的列中的值,由使用的 DAX 公式确定。尽管 DAX 公式不包含对行的引用,但 DAX 在计算值时会隐式理解行上下文。

当您定义计算列时,DAX 会自动创建行上下文,并且使用 DAX 公式计算的所有计算值都将显示在计算列中。

相反,当您使用 SUMX 等 DAX 函数时,逐行计算的值将相加,并且只会显示最终结果。也就是说,中间值将被丢弃。

当您具有相关表时,行上下文将确定相关表中的哪些行与当前行关联。但是,行上下文不会自动通过关系传播。您必须为此使用 DAX 函数 - RELATED 和 RELATEDTABLE。

多个行上下文

DAX 具有 SUMX 等迭代器函数。您可以使用这些函数嵌套行上下文。通过这种方式,您可以在程序中对内部循环和外部循环进行递归,其中您可以拥有多个当前行和当前行上下文。

例如,您可以使用 DAX 函数 Earlier(),它存储来自在当前操作之前进行的操作的行上下文。此函数在内存中存储两组上下文 - 一组上下文表示公式内部循环的当前行,另一组上下文表示公式外部循环的当前行。DAX 会自动在两个循环之间提供值,以便您可以创建复杂的聚合。

例如,请参阅“场景 - 对值进行排名和比较”一章中的“创建动态排名值的 DAX 公式”方案。

筛选上下文

筛选上下文是指应用于 DAX 中数据模型的任何筛选。筛选上下文由数据透视表和 DAX 函数创建。

由数据透视表创建的筛选上下文

由数据透视表创建的筛选上下文是由对以下数据透视表字段所做的选择应用的自然筛选 -

  • 筛选器
  • 切片器

由数据透视表创建的筛选上下文会筛选数据模型中的基础表。如果表之间存在关系,则筛选器会从查找表向下传递到数据表。这意味着,您可以根据查找表的结果筛选数据表。筛选器传播不会反向发生。但是,您可以使用 DAX 公式根据数据表的结果筛选查找表。

DAX 函数创建的筛选上下文

您可以使用 DAX 筛选器函数来定义计算字段和计算列,这些字段和列包含控制 DAX 公式使用值的筛选器表达式。然后,这些计算字段和计算列成为数据透视表字段列表的一部分,您可以将它们添加到数据透视表中。您还可以使用这些 DAX 筛选器函数有选择地清除特定列上的筛选器。CALCULATE() 是一个强大的 DAX 筛选器函数,用于创建筛选上下文。有关示例,请参阅“方案 - 执行复杂计算”一章。

筛选上下文作为行上下文的补充

行上下文不会自动创建筛选上下文。您可以使用包含 DAX 筛选器函数的 DAX 公式实现相同的效果。

Excel DAX - 公式

DAX 是一种用于在 Power Pivot 表中创建自定义计算的公式语言。您可以在 DAX 公式中使用专为处理关系数据和执行动态聚合而设计的 DAX 函数。

DAX 公式与 Excel 公式非常相似。要创建 DAX 公式,请键入等号,然后键入函数名称或表达式以及任何必需的值或参数。

DAX 函数与 DAX 公式

DAX 公式可以包含 DAX 函数并利用其用法。这就是 DAX 公式在重要方面往往不同于 DAX 函数的地方。

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

  • 如果要基于逐行的方式自定义计算,Power Pivot 提供了一些函数,让您可以使用当前行值或相关值来执行根据上下文变化的计算。

  • DAX 包含一种函数类型,其结果返回一个表,而不是单个值。这些函数可用于为其他函数提供输入,从而计算整个表或列的值。

  • 某些 DAX 函数提供时间智能,使您能够使用有意义的日期范围创建计算,并在并行期间比较结果。

了解 DAX 公式语法

每个 DAX 公式都具有以下语法:

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

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

以下是一些有效的 DAX 公式:

  • [column_Cost] + [column_Tax]
  • = Today ()

了解 IntelliSense 功能

DAX 提供了 IntelliSense 功能,使您能够快速准确地编写 DAX 公式。使用此功能,您无需完全键入表、列和函数名称,而是在编写 DAX 公式时从下拉列表中选择相关的名称。

  • 开始键入函数名称的前几个字母。自动完成会显示以这些字母开头的可用函数列表。

  • 将指针放在任何函数名称上。将显示 IntelliSense 工具提示,向您提供函数的用途。

  • 单击函数名称。函数名称将显示在公式栏中,并显示语法,这将在您选择参数时为您提供指导。

  • 键入所需的表名的第一个字母。自动完成会显示以该字母开头的可用表和列的列表。

  • 按 Tab 键或单击名称以将自动完成列表中的项目添加到公式中。

  • 单击Fx按钮以显示可用函数的列表。要从下拉列表中选择函数,请使用箭头键突出显示项目,然后单击“确定”将函数添加到公式中。

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

强烈建议使用此方便的 IntelliSense 功能。

在何处使用 DAX 公式?

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

  • 您可以在计算列中使用 DAX 公式,方法是添加一列,然后在公式栏中键入表达式。您可以在 Power Pivot 窗口中创建这些公式。

  • 您可以在计算字段中使用 DAX 公式。您可以创建这些公式:

    • 在 Excel 窗口的“计算字段”对话框中,或

    • 在 Power Pivot 窗口的表的计算区域中。

相同的公式在计算列或计算字段中使用时,其行为可能会有所不同。

  • 在计算列中,公式始终应用于整个表中列中的每一行。根据行上下文,值可能会发生变化。

  • 但是,在计算字段中,结果的计算在很大程度上取决于上下文。也就是说,数据透视表的​​设计以及行和列标题的选择会影响计算中使用的值。

要编写 DAX 公式,务必了解 DAX 中的上下文概念。在您开始使用 DAX 的初期,这可能有点困难,但一旦您掌握了它,您就可以编写有效的 DAX 公式,这些公式是复杂和动态数据分析所必需的。有关详细信息,请参阅“DAX 上下文”一章。

创建 DAX 公式

您已经在上一节中了解了 IntelliSense 功能。在创建任何 DAX 公式时,请务必使用它。

要创建 DAX 公式,请执行以下步骤:

  • 键入等号。

  • 在等号右侧,键入以下内容:

    • 键入函数或表名的第一个字母,然后从下拉列表中选择完整的名称。

    • 如果您选择了函数名称,请键入括号“(”。

    • 如果您选择了表名,请键入方括号“ [”。键入列名的第一个字母,然后从下拉列表中选择完整的名称。

    • 用“]”关闭列名,用“)”关闭函数名。

    • 在表达式之间键入 DAX 运算符或键入“,”以分隔函数参数。

    • 重复步骤 1-5,直到 DAX 公式完成。

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

SUM ([East_Sales[Amount]) 

如“DAX 语法”一章中所述,建议在每次引用任何列名时都使用表名以及列名。这被称为“完全限定名称”。

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

为计算列创建 DAX 公式

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

  • 单击要向其中添加计算列的表的选项卡。
  • 单击功能区上的“设计”选项卡。
  • 单击“添加”。
  • 在公式栏中键入计算列的 DAX 公式。
= DIVIDE (East_Sales[Amount], East_Sales[Units])

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

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

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

  • 重复步骤 1 和 2,直到完成表中的所有行。

使用上述公式,您添加了一列用于销售这些单位的单价。

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

有关详细信息,请参阅“计算列”一章。

为计算字段创建 DAX 公式

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

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

  • 要在 Power Pivot 窗口中为计算字段创建 DAX 公式,请单击相关表中计算区域中的一个单元格。以 CalculatedFieldName:= 开头 DAX 公式。

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

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

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

使用公式栏创建 DAX 公式

Power Pivot 窗口也有一个公式栏,它类似于 Excel 窗口公式栏。公式栏使创建和编辑公式变得更容易,使用自动完成功能可以最大程度地减少语法错误。

  • 要输入表名,请开始键入表名。公式自动完成功能提供了一个下拉列表,其中包含以这些字母开头的有效表名。您可以从一个字母开始,并键入更多字母以缩小列表范围(如果需要)。

  • 要输入列名,您可以从所选表中的列名列表中选择它。在表名的右侧键入方括号“ [”,然后从所选表中的列列表中选择该列。

使用自动完成的提示

以下是一些使用自动完成的提示:

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

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

  • 不会自动添加函数的右括号。您需要自己添加。

  • 您必须确保每个函数在语法上都是正确的。

了解插入函数功能

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

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

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

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

“插入函数”对话框可帮助您按类别选择函数,并提供每个函数的简短说明。

Understanding Insert Function

在 DAX 公式中使用插入函数

假设您要创建以下计算字段:

Medal Count: = COUNTA (]Medal]) 

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

  • 单击“结果”表的计算区域。
  • 在公式栏中键入以下内容:
Medal Count: = 
  • 单击“插入函数”按钮(fx)。

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

  • 在“选择类别”框中选择“统计”,如下面的屏幕截图所示。

  • 在“选择函数”框中选择 COUNTA,如下面的屏幕截图所示。

Using Insert Function

如您所见,将显示所选 DAX 函数语法和函数说明。这使您能够确保它是您要插入的函数。

  • 单击“确定”。“Medal Count:=COUNTA(”将出现在公式栏中,并且还会出现显示函数语法的工具提示。

  • 键入 [. 这意味着您即将键入列名。当前表中所有列和计算字段的名称都将显示在下拉列表中。您可以使用智能感知来完成公式。

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

  • 单击 Medal。

Click Medal
  • 双击 Medal。“Medal Count: = COUNTA([Medal]”将显示在公式栏中。关闭括号。

  • 按 Enter 键。您完成了。您也可以使用相同的过程来创建计算列。您还可以按照相同的步骤在 Excel 窗口的“计算字段”对话框中使用“插入函数”功能插入函数。

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

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

在 DAX 公式中使用多个函数

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

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

  • 公式将非常难以创建。
  • 如果公式存在错误,则将非常难以调试。
  • 公式计算速度不会很快。

在这种情况下,您可以将公式拆分为更小的可管理公式,并逐步构建大型公式。

使用标准聚合创建 DAX 公式

执行数据分析时,您将对聚合数据执行计算。DAX 中有几个聚合函数,例如 SUM、COUNT、MIN、MAX、DISTINCTCOUNT 等,您可以在 DAX 公式中使用它们。

您可以使用 Power Pivot 窗口中的“自动求和”功能自动创建使用标准聚合的公式。

  • 单击 Power Pivot 窗口中的“结果”选项卡。将显示“结果”表。
  • 单击“Medal”列。将选择整列 – Medal。
  • 单击功能区上的“开始”选项卡。
  • 单击“计算”组中“自动求和”旁边的向下箭头。
Creating a DAX Formula Using Standard Aggregations
  • 在下拉列表中单击 COUNT。
Click Count

如您所见,计算字段“Medal 的计数”出现在列 – Medal 下方的计算区域中。DAX 公式也出现在公式栏中:

Count of Medal: = COUNTA([Medal]) 

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

请注意 – 要使用“自动求和”功能,您需要单击功能区上“自动求和”旁边的向下箭头。如果您改为单击“自动求和”本身,则会得到:

Sum of Medal: = SUM([Medal]) 

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

Error

您可以参考“DAX 错误参考”一章以了解有关 DAX 错误的详细信息。

DAX 公式和关系模型

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

当您在两个表之间创建关系时,您需要确保用作键的两个列的值至少对于大多数行(如果不是全部)都匹配。在 Power Pivot 数据模型中,即使在键列中存在不匹配的值,也可以创建关系,因为 Power Pivot 不强制执行引用完整性(有关详细信息,请参阅下一节)。但是,键列中存在空白或不匹配的值可能会影响 DAX 公式的结果和数据透视表的显示。

引用完整性

建立引用完整性涉及构建一组规则,以在输入或删除数据时保留表之间定义的关系。如果您不完全确保这一点,因为 Power Pivot 不强制执行它,您可能无法在进行数据更改之前创建的 DAX 公式中获得正确的结果。

如果您强制执行引用完整性,则可以防止以下陷阱:

  • 在相关表中添加行,而主表中没有关联行(即,键列中具有匹配值的行)。

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

  • 删除主表中的行,而相关表的行中存在匹配的数据值。

更新 DAX 公式的结果

DAX 公式用于涉及大量数据的计算,包括来自外部数据源的数据。由于 DAX 计算也适用于实时数据,因此数据可能会不时发生变化。

DAX 公式的结果需要在两种情况下更新:

  • 数据刷新 - 数据刷新时。

  • 重新计算 - DAX 公式发生更改时。

了解数据刷新与重新计算

数据刷新和重新计算是两个独立但相关的操作。

  • 数据刷新是从外部数据源获取最新数据,更新工作簿中数据模型中数据的过程。

  • 重新计算是更新工作簿中包含 DAX 公式的所有列、表和数据透视表的过程,以反映由于 DAX 公式本身的更改而导致的基础数据中的更改。

在重新计算其中的 DAX 公式之前,您不应保存或发布工作簿。

更新数据模型中数据的不同方法

Power Pivot 不会自动检测外部数据源中的更改。

  • 您可以从 Power Pivot 窗口手动刷新数据,并以您可以指定的间隔刷新数据。

  • 如果已将工作簿发布到 SharePoint 网站,则可以安排从外部源自动刷新数据。

有关这些内容的详细信息,请参阅“更新数据模型中的数据”一章。

DAX 公式的重新计算

DAX 公式的重新计算是一项重要的任务,因为在重新计算期间,将检查列依赖项,如果列已更改、数据无效或工作正常的 DAX 公式中出现错误,您将收到通知。

重新计算会以以下方式影响性能:

  • 对于计算列,每当您更改 DAX 公式时,都应始终重新计算整个列的 DAX 公式的结果。

  • 对于计算字段,除非将计算字段置于数据透视表或数据透视图的上下文中,否则不会计算 DAX 公式的结果。当您更改影响数据筛选器的任何行或列标题或手动刷新数据透视表时,将重新计算 DAX 公式。

在 DAX 中,可以自动或手动重新计算公式。

要详细了解重新计算,请参阅“重新计算 DAX 公式”一章。

Excel DAX - 更新数据模型中的数据

DAX 用于计算 Excel Power Pivot 中数据模型中的数据。DAX 使数据建模和报告活动能够以有效的方式进行处理。但是,这需要不时更新数据模型中的数据,以反映当前数据。

您可以通过建立数据连接将数据从外部数据源导入到工作簿的数据模型中。您可以随时更新源中的数据。如果您从包含实时销售信息的关系数据库或每天更新多次的数据馈送中获取数据,此选项非常方便。

更新数据模型中数据的不同方法

您可以通过以下方式更新数据模型中的数据:

  • 不时刷新数据模型中的数据。
  • 更改数据源,例如连接属性。
  • 源数据更改后更新数据模型中的数据。
  • 筛选数据以选择性地加载数据源中表中的行。

刷新数据模型中的数据

除了从现有源获取更新的数据外,每当您对源数据的架构进行更改时,您都需要刷新工作簿中的数据。这些更改可能包括添加列或表,或更改导入的行。

请注意,添加数据、更改数据或编辑筛选器始终会触发依赖于该数据源的 DAX 公式的重新计算。有关详细信息,请参阅“重新计算 DAX 公式”一章。

数据模型中有两种类型的数据刷新:

手动刷新

如果您选择手动刷新选项,则可以随时手动刷新数据模型中的数据。您可以刷新所有数据(这是默认设置),也可以手动选择要为各个数据源刷新的表和列。

自动或计划刷新

如果已将工作簿发布到支持 PowerPivot 的 PowerPivot 库或 SharePoint 网站,则您或 SharePoint 管理员可以创建一个计划来自动更新工作簿中的数据。在这种情况下,您可以在服务器上安排无人值守的数据刷新。

手动刷新现有数据源

您可以随时手动刷新数据,如果您需要更新来自现有数据源的数据或获取最新数据以设计新的 DAX 公式。您可以刷新单个表、共享相同数据连接的所有表或数据模型中的所有表。

如果您已从关系数据源(例如 SQL Server 和 Oracle)导入数据,则可以在一个操作中更新所有相关表。将新数据或更新的数据加载到数据模型的操作通常会触发 DAX 公式的重新计算,这两者都可能需要一些时间才能完成。因此,在更改数据源或刷新从数据源获取的数据之前,您应该意识到潜在的影响。

要刷新单个表或数据模型中所有表的数据,请执行以下操作 -

  • 在 Power Pivot 窗口中的功能区上单击“开始”选项卡。
  • 单击“刷新”。
  • 单击下拉列表中的“刷新”以刷新选定的表。
  • 单击下拉列表中的“全部刷新”以刷新所有表。
Manually Refreshing

要刷新数据模型中使用相同连接的所有表的数据,请执行以下操作 -

  • 在 Power Pivot 窗口中的功能区上单击“开始”选项卡。
  • 单击“获取外部数据”组中的“现有连接”。

将出现“现有连接”对话框。

  • 选择一个连接。
  • 单击“刷新”按钮。
Existing Connections

将出现“数据刷新”对话框,并且在 PowerPivot 引擎从选定的表或数据源中的所有表重新加载数据时,将显示数据刷新进度信息。

有三种可能的结果 -

  • 成功 - 报告导入到每个表中的行数。

  • 错误 - 如果数据库脱机,您不再拥有权限,则可能会发生错误。源中已删除或重命名表或列。

  • 已取消 - 这表示 Excel 未发出刷新请求,可能是因为连接上已禁用刷新。

Possible Outcomes

单击“关闭”按钮。

更改数据源

要更改数据模型中的数据,您可以编辑连接信息或更新 Power Pivot 窗口中数据模型中使用的表和列的定义。

您可以对现有数据源进行以下更改 -

连接

  • 编辑数据库名称或服务器名称。
  • 更改源文本文件、电子表格或数据源的名称。
  • 更改数据源的位置。
  • 对于关系数据源,更改默认目录或初始目录。
  • 更改用于访问数据的身份验证方法或凭据。
  • 编辑数据源上的高级属性。

  • 添加或删除数据上的筛选器。
  • 更改筛选器条件。
  • 添加或删除表。
  • 更改表名。
  • 编辑数据源中的表和数据模型中的表之间的映射。
  • 从数据源中选择不同的列。

  • 更改列名。
  • 添加新列。
  • 从数据模型中删除列(不影响数据源)。

您可以通过以下方式编辑现有数据源的属性 -

  • 您可以更改连接信息,包括用作源的文件、源或数据库、其属性或其他提供程序特定的连接选项。

  • 您可以更改表和列映射,并删除对不再使用的列的引用。

  • 您可以更改从外部数据源获取的表、视图或列。

修改现有数据源的连接

您可以通过更改当前连接使用的外部数据源来修改您已创建的到外部数据源的连接。但是,要遵循的步骤取决于数据源类型。

  • 在 PowerPivot 窗口中的功能区上单击“开始”选项卡。
  • 单击“获取外部数据”组中的“现有连接”。
Modifying Connection

将出现“现有连接”对话框。选择要修改的连接。

根据您正在更改的数据源类型,提供程序可能会有所不同。此外,可用的属性可能需要更改。考虑一个连接到包含数据的 Excel 工作簿的简单示例。

Excel Workbook Contains Data
  • 单击“编辑”按钮。将出现“编辑连接”对话框。

  • 单击“浏览”按钮以查找相同类型(在此示例中为 Excel 工作簿)但名称或位置不同的另一个数据库。

  • 单击“打开”按钮。

将选择新文件。将显示一条消息,指出您已修改连接信息,需要保存并刷新表以验证连接。

Message
  • 单击“保存”按钮。您将返回到“现有连接”对话框。

  • 单击“刷新”按钮。将出现“数据刷新”对话框,显示数据刷新进度。将显示数据刷新的状态。有关详细信息,请参阅 - 手动刷新现有数据源 部分。

  • 数据刷新成功后,单击“关闭”。

  • 在“现有连接”对话框中单击“关闭”。

编辑表和列映射(绑定)

要在数据源更改时编辑列映射,请执行以下操作 -

  • 在 Power Pivot 窗口中单击包含要修改的表的选项卡。

  • 单击功能区上的“设计”选项卡。

  • 单击“表属性”。

Editing Table

将出现“编辑表属性”对话框。

Edit Table Properties

您可以观察到以下内容 -

  • 数据模型中所选表的名称显示在“表名”框中。

  • 外部数据源中对应表的名称显示在“源名称”框中。

  • 有两个选项用于列名 - 源和模型。

  • 如果数据源和数据模型中的列名称不同,则可以通过选择这些选项在两组列名称之间切换。

  • 对话框中将显示所选表的预览。

您可以编辑以下内容 -

  • 要更改用作数据源的表,请在“源名称”下拉列表中选择与所选表不同的表。

  • 如有必要,更改列映射 -

    • 要添加源中存在但数据模型中不存在的列,请选中列名称旁边的复选框。对要添加的所有列重复此操作。下次刷新时,实际数据将加载到数据模型中。

    • 如果数据模型中的一些列在当前数据源中不再可用,则通知区域中将显示一条消息,列出无效列。您无需执行任何操作。

  • 单击“保存”按钮。

保存当前的表属性集时,您将收到一条消息 - 请稍候。然后将显示检索到的行数。

在数据模型中的表中,任何无效列都将自动删除,并将添加新列。

更改列名和数据类型

您可以按如下方式更改数据模型中表中列的名称 -

  • 双击列的标题。标题中的列名将突出显示。

  • 键入新的列名,覆盖旧名称。或者,您可以按如下方式更改数据模型中表中列的名称

  • 通过单击其标题选择列。

  • 右键单击该列。

  • 在下拉列表中单击“重命名列”。

Changing Column Name

标题中的列名将突出显示。键入新的列名,覆盖旧名称。

正如您所了解的,数据模型中表中列中的所有值必须具有相同的数据类型。

要更改列的数据类型,请执行以下操作 -

  • 通过单击其标题选择要更改的列。

  • 单击功能区上的“开始”选项卡。

  • 单击“格式”组中的控件以修改列的数据类型和格式。

Check the Controld

添加/更改数据源的筛选器

在导入数据以限制数据模型中表中的行数时,您可以向数据源添加筛选器。稍后,您可以通过更改之前定义的筛选器来添加更多行或减少数据模型中表中的行数。

在导入期间向数据源添加筛选器

要在数据导入期间向数据源添加新的筛选器,请执行以下操作 -

  • 在 Power Pivot 窗口中的功能区上单击“开始”选项卡。
  • 单击“获取外部数据”组中的一个数据源。

将出现“表导入向导”对话框。

  • 继续执行“选择表和视图”步骤。
  • 选择一个表,然后单击“预览和筛选器”。
Adding a Filter to Data Source

将出现“预览所选表”对话框。

  • 单击要应用筛选器的列。
  • 单击列标题右侧的下拉箭头。
Preview Selected Table

要添加筛选器,请执行以下操作之一 -

  • 在列值列表中,选择或清除一个或多个要筛选的值,然后单击“确定”。

    但是,如果值的数量非常多,则列表中可能不会显示各个项目。相反,您将看到消息 -“项目过多,无法显示”。

  • 单击“数字筛选器”或“文本筛选器”(取决于列的数据类型)。

    • 然后,单击比较运算符命令之一(例如“等于”),或单击“自定义筛选器”。在“自定义筛选器”对话框中,创建筛选器,然后单击“确定”。

注意 - 如果您在任何阶段出错,请单击“清除行筛选器”按钮并重新开始。

  • 单击“确定”。您将返回到“表导入向导”的“选择表和视图”页面。
View Page

您可以观察到,在“筛选器详细信息”列中,为定义了筛选器的列显示了一个链接“已应用筛选器”。

您可以单击该链接以查看向导构建的筛选器表达式。但是,每个筛选器表达式的语法都取决于提供程序,您无法编辑它。

Link to View
  • 单击“完成”以导入已应用筛选器的数据。
  • 关闭“表导入向导”。

更改现有数据源的筛选器

导入数据后,您可能需要不时更新它,方法是添加更多行或限制表中现有行。在这种情况下,您可以更改表上的现有筛选器或添加新的筛选器。

  • 在 Power Pivot 窗口中的功能区上单击“开始”选项卡。

  • 单击“获取外部数据”组中的“现有连接”。将出现“现有连接”对话框。

  • 单击包含要更改筛选器的表的连接。

  • 单击“打开”按钮。

Changing a Filter

您将进入“表导入向导”对话框。重复上一节中的步骤以筛选列。

Excel DAX - 重新计算 DAX 公式

DAX 公式的重新计算需要反映数据中的更改和公式本身的更改。但是,重新计算 DAX 公式会涉及性能成本。

即使如此,为了获得准确的结果,重新计算也是必不可少的。在重新计算期间,将检查列依赖项,如果列已更改,如果数据无效或如果以前有效的 DAX 公式中出现错误,您将收到通知。

重新计算类型

您有两种重新计算 DAX 公式的选项 -

  • 自动重新计算模式(默认)
  • 手动重新计算模式

默认情况下,Power Pivot 会根据需要自动重新计算,同时优化处理所需的时间。但是,如果您使用的是复杂的公式或非常大的数据集,并且想要控制更新的时间,则可以选择手动更新计算。

重新计算 DAX 公式的自动和手动模式都具有优势。但是,建议使用自动重新计算模式。这样,您可以使 Power Pivot 数据保持同步,并防止由数据删除、名称或数据类型更改或缺少依赖项引起的问题。

自动重新计算 DAX 公式

如果您选择重新计算 DAX 公式的默认模式,即自动重新计算,则任何会导致任何 DAX 公式的结果发生变化的数据更改都将触发包含 DAX 公式的整个列的重新计算。

以下更改始终需要重新计算 DAX 公式 -

  • 外部数据源中的值已刷新。

  • DAX 公式本身已更改。

  • DAX 公式中引用的表或列的名称已更改。

  • 表之间的关系已添加、修改或删除。

  • 已添加新的计算字段或计算列。

  • 工作簿中对其他 DAX 公式进行了更改,因此需要重新计算依赖于这些 DAX 公式的列或计算。

  • 表中已插入或删除行。

  • 您应用了一个需要执行查询以更新数据集的筛选器。筛选器可以应用于 DAX 公式中,也可以应用于数据透视表或数据透视图中。

何时使用手动重新计算模式?

在您准备好工作簿中所有所需的 DAX 公式之前,可以使用手动重新计算模式。这样,您可以避免在仍处于草稿状态的工作簿上计算公式结果的成本。

您可以在以下情况下使用 DAX 公式的手动重新计算:

  • 您正在使用模板设计 DAX 公式,并且希望在验证公式之前更改 DAX 公式中使用的列和表的名称。

  • 您知道工作簿中的一些数据已更改,但您正在使用未更改的不同列,因此您希望推迟重新计算。

  • 您正在使用一个具有许多依赖项的工作簿,并且希望推迟重新计算,直到您确定所有必要的更改都已完成。

但是,您应该知道,只要工作簿配置为手动重新计算模式,就不会执行任何公式的验证或检查。这将导致以下结果:

  • 您添加到工作簿中的任何新公式都将被标记为包含错误。

  • 新计算列中不会显示任何结果。

配置工作簿以进行手动重新计算

正如您所了解的,自动重新计算是任何工作簿的数据模型中的默认模式。要将工作簿配置为手动重新计算,请执行以下操作:

  • 在 Power Pivot 窗口的“功能区”中单击“设计”选项卡。
  • 单击“计算”组中的“计算选项”。
  • 在下拉列表中单击“手动计算模式”。
Workbook For Manual Recalculation

手动重新计算 DAX 公式

要手动重新计算 DAX 公式,请执行以下操作:

  • 在 Power Pivot 窗口的“功能区”中单击“设计”选项卡。
  • 单击“计算”组中的“计算选项”字段。
  • 在下拉列表中单击“立即计算”字段。
Recalculating DAX Formulas Manually

DAX 公式重新计算故障排除

每当工作簿的数据模型发生更改时,Power Pivot 都会对现有数据进行分析,以确定是否需要重新计算,并以最有效的方式执行更新。

在重新计算 DAX 公式期间,Power Pivot 处理以下内容:

  • 依赖项
  • 相关列的重新计算顺序
  • 事务
  • 易失函数的重新计算

依赖项

当一个列依赖于另一个列,并且该另一个列的内容以任何方式更改时,所有相关列可能都需要重新计算。

Power Pivot 始终对表执行完全重新计算,因为完全重新计算比检查更改的值更有效。触发重新计算的更改可能包括删除列、更改列的数值数据类型或添加新列。这些更改被视为重大更改。但是,看似微不足道的更改(例如更改列的名称)也可能触发重新计算。这是因为列的名称在 DAX 公式中用作标识符。

在某些情况下,Power Pivot 可能会确定可以将列排除在重新计算之外。

相关列的重新计算顺序

依赖项在任何重新计算之前计算。如果有多个列相互依赖,Power Pivot 将遵循依赖项的顺序。这确保列以正确的顺序以最大速度进行处理。

事务

重新计算或刷新数据的操作作为事务进行。这意味着,如果刷新操作的任何部分失败,则其余操作将回滚。这是为了确保数据不会处于部分处理状态。但是,您无法像在关系数据库中那样管理事务或创建检查点。

易失函数的重新计算

DAX 函数(如 NOW、RAND 或 TODAY)没有固定值,被称为易失函数。如果在计算列中使用此类 DAX 函数,则查询或筛选的执行通常不会导致它们重新评估,以避免性能问题。

仅当重新计算整列时,才会重新计算这些 DAX 函数的结果。这些情况包括来自外部数据源的刷新或导致重新评估包含这些函数的 DAX 公式的数据的手动编辑。

但是,如果在计算字段的定义中使用这些函数,则始终会重新计算这些函数。

Excel DAX - 公式错误

当您使用错误语法编写**DAX 公式**时,可能会出现错误。计算字段和计算列可以包含需要特定类型参数的 DAX 函数。DAX 函数的参数可以是表、列或其他 DAX 函数(嵌套 DAX 函数)。由于 DAX 函数可以返回表和列,因此应注意检查是否将正确类型的参数传递给 DAX 函数。

DAX 公式错误可以是语法错误或语义错误。错误可以在设计时或运行时发生。

在本章中,您将了解一些常见的 DAX 错误、其原因以及如何修复这些错误。

DAX 错误:计算中止

尝试使用 DAX 时间智能函数创建(设计时)或使用(运行时)计算字段时,可能会发生以下错误。在每种情况下,都会将非连续日期范围传递给时间智能函数。

“DAX 错误:计算中止:MdxScript(实例)(00,0)函数‘DATEADD’仅适用于连续日期选择。”

运行时原因

当将包含 DAX 时间智能函数的计算字段放置在数据透视表的“值”区域中,并且在选择年份之前选择月份或季度作为切片器或筛选器时,可能会显示此错误。例如,如果您有 2014 年、2015 年和 2016 年三年的数据,并且您尝试仅使用 3 月份而不选择“年份”字段,则这些值不是连续数据值,您将收到错误。

如何在运行时修复错误?

在上面的示例中,

  • 首先添加年份作为切片器或筛选器,并选择一年。

  • 然后,添加月份或季度作为切片器或筛选器。

  • 然后,选择一个或多个月份或季度来对所选年份进行切片或筛选。

设计时原因

DAX 时间智能函数需要为日期参数指定一个日期列。日期列必须具有连续的日期范围。如果日期列中的一行或多行中存在一个日期值与前一行和后一行的值不连续,则可能会返回此错误。

如果您从数据源导入包含日期的表,请记住,许多组织运行特殊的流程来扫描数据库中的表以查找无效值,并将其替换为特定值。也就是说,如果找到无效日期,则会为其分配一个特定日期值,该值可能与列中其他数据值不连续。

如何在设计时修复此错误?

请执行以下操作以在设计时修复错误:

  • 如果您的日期表是从数据源导入的,请使用 Power Pivot 窗口中的“刷新”重新导入在源中找到的任何更改。

  • 检查日期列中的值,以确保它们按连续顺序排列。如果发现任何值不在其位置,则必须在源处更正它,并且必须刷新日期表。

  • 在您的数据模型中创建单独的日期表和日期列。将新日期列指定为导致错误的公式中的日期参数。日期表易于创建并添加到数据模型中。

DAX 语义错误 - 示例

以下 DAX 错误是语义错误:

“在用作表筛选器表达式的真假表达式中使用了函数‘CALCULATE’。这是不允许的。”

原因

当一个或多个筛选器表达式无法在计算字段或计算列表达式的上下文中使用时,可能会出现此错误。

在大多数情况下,此错误是由指定为 DAX CALCULATE 函数参数的筛选器表达式引起的。CALCULATE 函数要求将筛选器定义为布尔表达式或表表达式。

如何修复此类错误?

您可以使用 DAX FILTER 函数将筛选器定义为表表达式来修复此类错误,然后将其用作 DAX CALCULATE 函数的参数。

Excel DAX - 时间智能

DAX 具有一个重要且强大的功能,称为**时间智能**。时间智能使您能够编写引用时间段以在数据透视表中使用的 DAX 公式。

DAX 有 35 个专门用于随时间推移聚合和比较数据的时间智能函数。但是,这些 DAX 函数对您需要了解并谨慎使用的数据有一些限制,以避免错误。

为什么时间智能使 DAX 功能强大?

时间智能函数使用不断变化的数据,具体取决于您在数据透视表和 Power View 可视化效果中选择的上下文。众所周知,大多数数据分析都涉及随时间推移对数据进行汇总、跨时间段比较数据值、了解趋势以及根据未来预测做出决策。

例如,您可能希望按产品汇总过去一个月的销售额,并将总额与财政年度中其他月份的总额进行比较。这意味着,您必须使用日期作为一种方法来对特定时间段内的销售交易进行分组和聚合。

这里您可以观察DAX的强大功能。您可以使用DAX时间智能函数来定义计算字段,帮助您分析随时间推移的数据,而无需更改数据透视表中的日期选择。这使您的工作更轻松。此外,您还可以构建其他方法无法构建的数据透视表。

DAX时间智能函数的要求

DAX时间智能函数有一定的要求。如果这些要求未满足,您可能会遇到错误或它们可能无法正常工作。因此,您也可以将这些要求视为规则或约束。以下是某些DAX时间智能函数的要求/规则/约束:

  • 您需要在数据模型中有一个日期表。

  • 日期表必须包含DAX认为是日期列的列。您可以根据需要命名该列,但它应符合以下条件:o 日期列应包含连续的日期集,涵盖您分析数据的整个时间段。

    • 每个日期必须在日期列中存在且仅存在一次。

    • 您不能跳过任何日期(例如,您不能跳过周末日期)。

  • DAX时间智能函数仅适用于标准日历,并假定年份开始于1月1日,年份结束于12月31日,并且每年的月份和每个月的天数与公历年份相同。

但是,您可以为不同的财政年度自定义标准日历。在使用任何时间智能函数之前,验证上述要求是一个好习惯。

有关日期表及其在DAX公式中用法的更多详细信息,请参阅本教程库中的教程= 使用DAX进行数据建模。

DAX时间智能函数 - 类别

DAX时间智能函数可以分类如下:

  • 返回单个日期的DAX函数。
  • 返回日期表的DAX函数。
  • 在一段时间内评估表达式的DAX函数。

返回单个日期的DAX函数

此类别中的DAX函数返回单个日期。

此类别中有10个DAX函数:

序号 DAX函数和返回值
1

FIRSTDATE (Date_Column)

返回当前上下文中Date_Column中的第一个日期。

2

LASTDATE (Date_Column)

返回当前上下文中Date_Column中的最后一个日期。

3

FIRSTNONBLANK (Date_Column, Expression)

返回表达式具有非空白值的第一个日期。

4

LASTNONBLANK (Date_Column, Expression)

返回表达式具有非空白值的最后一个日期。

5

STARTOFMONTH (Date_Column)

返回当前上下文中月份的第一个日期。

6

ENDOFMONTH (Date_Column)

返回当前上下文中月份的最后一个日期。

7

STARTOFQUARTER (Date_Column)

返回当前上下文中季度的第一个日期。

8

ENDOFQUARTER (Date_Column)

返回当前上下文中季度的最后一个日期。

9

STARTOFYEAR (Date_Column, [YE_Date])

返回当前上下文中年份的第一个日期。

10

ENDOFYEAR (Date_Column, [YE_Date])

返回当前上下文中年份的最后一个日期。

返回日期表的DAX函数

此类别中的DAX函数返回日期表。这些函数主要用作DAX函数-CALCULATE的SetFilter参数。

此类别中有16个DAX函数。其中8个DAX函数是“前一个”和“下一个”函数。

  • “前一个”和“下一个”函数从当前上下文中的日期列开始,计算前一天、前一个月、前一季度或前一年。

  • “前一个”函数从当前上下文中的第一个日期开始向后工作,“下一个”函数从当前上下文中的最后一个日期开始向前移动。

  • “前一个”和“下一个”函数以单列表的形式返回结果日期。

序号 DAX函数和返回值
1

PREVIOUSDAY (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中第一个日期的前一天的所有日期。

2

NEXTDAY (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中指定的第一个日期的下一天开始的所有日期。

3

PREVIOUSMONTH (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中第一个日期的前一个月的所有日期。

4

NEXTMONTH (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中第一个日期的下一个月的所有日期。

5

PREVIOUSQUARTER (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中第一个日期的前一季度的所有日期。

6

NEXTQUARTER (Date_Column)

返回一个表,该表包含一列表示当前上下文中Date_Column中指定的第一个日期的下一季度的所有日期。

7

PREVIOUSYEAR (Date_Column, [YE_Date])

返回一个表,该表包含一列表示当前上下文中Date_Column中最后一个日期的前一年的所有日期。

8

NEXTYEAR (Date_Column, [YE_Date])

返回一个表,该表包含一列表示当前上下文中Date_Column中第一个日期的下一年的所有日期。

四个(4)DAX函数计算一个时期内的一组日期。这些函数使用当前上下文中的最后一个日期执行计算。

序号 DAX函数和返回值
1

DATESMTD (Date_Column)

返回一个表,该表包含一列表示当前上下文中本月至今的日期。

2

DATESQTD (Date_Column)

返回一个表,该表包含一列表示当前上下文中本季度至今的日期。

3

DATESYTD (Date_Column, [YE_Date])

返回一个表,该表包含一列表示当前上下文中本年至今的日期。

4

SAMEPERIODLASTYEAR (Date_Column)

返回一个表,该表包含一列日期,这些日期从当前上下文中指定的Date_Column中的日期向后偏移一年。

注意- SAMEPERIODLASTYEAR要求当前上下文包含连续的日期集。

如果当前上下文不是连续的日期集,则SAMEPERIODLASTYEAR将返回错误。

  • 四个(4)DAX函数用于从当前上下文中的日期集转移到新的日期集。

    这些DAX函数比之前的函数更强大。

    • DAX函数 - DATEADD、DATESINPERIOD和PARALLELPERIOD从当前上下文偏移一些时间间隔。间隔可以是天、月、季度或年,分别由关键字- DAY、MONTH、QUARTER和YEAR表示。

      例如

  • 向后偏移2天。

  • 向前移动5个月。

  • 从今天起向前移动一个月。

  • 回到上一年的同一季度。

      如果函数参数-间隔数(整数值)为正,则偏移为向前,如果为负,则偏移为向后。

    • DAX函数 - DATESBETWEEN计算指定开始日期和结束日期之间的日期集。

序号 DAX函数和返回值
1

DATEADD (Date_Column, Number_of_Intervals, Interval)

返回一个表,该表包含一列日期,这些日期从当前上下文中的日期向前或向后偏移指定数量的间隔。

2

DATESINPERIOD (Date_Column, Start_Date, Number_of_Intervals, Interval)

返回一个表,该表包含一列日期,这些日期从start_date开始,持续指定数量的number_of_intervals。

3

PARALLELPERIOD (Date_Column, Number_of_Intervals, Interval)

返回一个表,该表包含一列日期,这些日期表示与当前上下文中指定的Date_Column中的日期平行的时期,并且日期向前或向后偏移一定数量的间隔。

4

DATESBETWEEN (Date_Column, Start_Date, End_Date)

返回一个表,该表包含一列日期,这些日期从start_date开始,持续到end_date。

在一段时间内评估表达式的DAX函数

此类别中的DAX函数在指定的时间段内评估表达式。

此类别中有九(9)个DAX函数:

  • 此类别中的三个(3)DAX函数可用于在指定的时间段内评估任何给定的表达式。

序号 DAX函数和返回值
1

TOTALMTD (Expression, Date_Column, [SetFilter])

评估当前上下文中本月至今日期的表达式的值。

2

TOTALQTD (Expression, Date_Column, [SetFilter])

评估当前上下文中本季度至今日期的表达式的值。

3

TOTALYTD (Expression, Date_Column, [SetFilter], [YE_Date])

评估当前上下文中本年至今日期的表达式的值

  • 此类别中的六(6)个DAX函数可用于计算期初和期末余额。

    • 任何时期的期初余额与前一时期的期末余额相同。

    • 期末余额包括截至期末的所有数据,而期初余额不包括当前时期内的任何数据。

    • 这些DAX函数始终返回在特定时间点评估的表达式的值。

  • 我们关心的时间点始终是日历期间的最后一个可能的日期值。

  • 期初余额基于前一时期的最后一天,而期末余额基于当前时期的最后一天。

  • 当前时期始终由当前日期上下文中的最后一天确定。

序号 DAX函数和返回值
1

OPENINGBALANCEMONTH (Expression, Date_Column, [SetFilter])

在当前上下文中月份的第一天评估表达式。

2

CLOSINGBALANCEMONTH (Expression, Date_Column, [SetFilter])

在当前上下文中月份的最后一天评估表达式。

3

OPENINGBALANCEQUARTER (Expression, Date_Column, [SetFilter])

在当前上下文中季度的第一天评估表达式。

4

CLOSINGBALANCEQUARTER (Expression, Date_Column, [SetFilter])

在当前上下文中季度的最后一天评估表达式。

5

OPENINGBALANCEYEAR (Expression, Date_Column, [SetFilter], [YE_Date])

在当前上下文中年份的第一天评估表达式。

6

CLOSINGBALANCEYEAR (Expression, Date_Column, [SetFilter], [YE_Date])

在当前上下文中年份的最后一天评估表达式。

Excel DAX - 筛选器函数

DAX具有强大的筛选器函数,与Excel函数有很大不同。查找函数通过使用表和关系(如数据库)来工作。筛选器函数允许您操作数据上下文以创建动态计算。

注意- 返回表的DAX筛选器函数不会将表添加到数据模型中。结果表用作另一个DAX函数中的参数。也就是说,此类DAX函数用作其他DAX函数的嵌套函数。

在下一节中,您将学习可以使用哪些DAX筛选器函数。有关这些函数的更多详细信息,请参阅本教程库中的教程 - DAX函数。

DAX 筛选函数

以下是DAX筛选器函数:

序号 DAX函数和函数的功能?
1

ADDMISSINGITEMS (<showAllColumn>, [<showAllColumn>] …, <table>, <groupingColumn>, [<groupingColumn>] …, [filterTable] …)

如果表中尚不存在,则将多个列的项目组合添加到表中。添加哪些项目组合的确定是基于引用包含所有列可能值的源列。

要确定要评估的不同列的项目组合:

  • AutoExist 应用于同一表中的列。
  • CrossJoin 应用于不同的表。
2

ALL ( {<table> | <column>, [<column>], [<column>], … })

返回给定表中的所有行,或表中指定列的所有值,忽略可能已应用的任何筛选器。

此函数可用于清除筛选器并在表中的所有行上创建计算。

3

ALLEXCEPT (<table>, <column>, [<column>], …)

删除表中的所有上下文筛选器,除了已应用于指定为参数的列的筛选器。

与 ALL 相比,当您想要删除表中许多(但不是全部)列上的筛选器时,可以使用此函数。

4

ALLNOBLANKROW (<table>|<column>)

从关系的父表中返回 -

  • 所有行,但空白行除外,或
  • 列的所有不同值,但空白行除外

此函数会忽略可能存在的任何上下文筛选器。

5

ALLSELECTED ( [<tableName>|<columnName>] )

从当前查询中的列和行中删除上下文筛选器,同时保留所有其他上下文筛选器或显式筛选器。

6

CALCULATE (<expression>, [<filter1>, <filter2> …)]

在由指定筛选器修改的上下文中评估表达式。

返回表达式的结果值。

7

CALCULATETABLE (<expression>, <filter1>, <filter2>, …)

在由给定筛选器修改的上下文中评估表表达式。

返回一个值表。

8

CROSSFILTER (<columnName1>, <columnName2>, <direction>)

指定在两个列之间存在的关系的计算中使用的交叉筛选方向。不返回值。

9

DISTINCT (<column>)

返回一个单列表,其中包含指定列中的不同值。换句话说,重复的值将被删除,并且只返回唯一的值。

结果列用作另一个 DAX 函数的参数。

10

EARLIER (<column>, <number>)

返回指定列在提到的列(由数字指定)的外部评估传递中的当前值。

11

EARLIEST (<column>)

返回指定列在指定列的外部评估传递中的当前值。

12

FILTER (<table>, <filter>)

返回一个仅包含筛选行的表。

FILTER 仅用作嵌入在其他需要表作为参数的函数中的函数。

13

FILTERS (<columnName>)

返回直接应用于 columnName 的筛选器值。

FILTERS 仅用作嵌入在其他需要表作为参数的函数中的函数。

14

HASONEFILTER (<columnName>)

当 columnName 上的直接筛选值的个数为 1 时返回 TRUE。否则,返回 FALSE。

15

HASONEVALUE (<columnName>)

当 columnName 的上下文仅筛选到一个唯一值时返回 TRUE。否则,返回 FALSE。

16

ISCROSSFILTERED (<columnName>)

当 columnName 或同一张表或相关表中的另一列正在被筛选时返回 TRUE。

17

ISFILTERED (<columnName>)

当 columnName 正在被直接筛选时返回 TRUE。如果列上没有筛选器,或者筛选是由于同一张表或相关表中的另一列被筛选而发生的,则函数返回 FALSE。

18

KEEPFILTERS (<expression>)

修改在评估 CALCULATE 或 CALCULATETABLE 函数时如何应用筛选器。

19

RELATED (<column>)

从另一张表返回相关值。

20

RELATEDTABLE (<tableName>)

在由给定筛选器修改的上下文中评估表表达式。

21

SUBSTITUTEWITHINDEX (<table>, <indexColumnName>, <indexColumnTable>, <orderBy_expression>, [<order>])

返回一个表示两个作为参数提供的表的左半连接的表。

半连接是通过使用公共列执行的,这些公共列由公共列名和公共数据类型确定。

正在连接的列将替换为返回表中的单个列,该列的类型为整数,并包含索引。

索引是给定指定排序顺序的右连接表中的引用。

22

USERELATIONSHIP ( <columnName1>,<columnName2>)

指定在特定计算中使用的关系,作为 columnName1 和 columnName2 之间存在的关系。

23

VALUES (<TableNameOrColumnName>)

返回一个单列表,其中包含指定表或列中的不同值。

换句话说,重复的值将被删除,并且只返回唯一的值。

Excel DAX - 场景

在前面的章节中,您已经学习了 DAX 语法、DAX 运算符和 DAX 函数的使用。如您所知,DAX 是一种用于数据建模和数据分析的公式语言。

DAX 可用于各种场景。基于 DAX 场景,DAX 会优化性能并生成准确有效的结果。在本章中,您将了解一些 DAX 场景。

执行复杂计算

DAX 公式可以执行涉及自定义聚合、筛选和使用条件值的复杂计算。您可以使用 DAX 执行以下操作

  • 为数据透视表创建自定义计算。
  • 将筛选器应用于公式。
  • 选择性地删除筛选器以创建动态比率。
  • 使用外部循环中的值。

有关详细信息,请参阅“场景 - 执行复杂计算”一章。

处理文本和日期

DAX 可用于处理文本、提取和组合日期和时间值或基于条件创建值的场景。您可以使用 DAX 执行以下操作 -

  • 通过连接创建键列。
  • 基于从文本日期中提取的日期部分组合日期。
  • 定义自定义日期。
  • 使用公式更改数据类型。
    • 将实数转换为整数。
    • 将实数、整数或日期转换为字符串。
    • 将字符串转换为实数或日期。

有关详细信息,请参阅“场景 - 处理文本和日期”一章。

条件值和错误测试

DAX 函数能够测试数据中的值,并根据条件返回不同的值。用于测试值的 DAX 函数也可用于检查值的范围或类型,以防止意外的数据错误导致计算中断。您可以使用 DAX 执行以下操作 -

  • 基于条件创建值。
  • 测试公式中的错误。

有关详细信息,请参阅“场景 - 条件值和错误测试”一章。

使用时间智能

您已在“了解 DAX 时间智能”一章中学习了有关 DAX 时间智能函数的知识。

DAX 时间智能函数包括帮助您从数据中检索日期或日期范围的函数。然后,您可以使用这些日期或日期范围来计算跨类似时期的值。时间智能函数还包括处理标准日期间隔的函数,允许您跨月、年或季度比较值。您还可以创建一个 DAX 公式来比较指定时期的第一个和最后一个日期的值。

您可以了解有关 DAX 智能函数及其功能的更多信息,以下列出了一些示例 -

  • 计算累计销售额。
  • 比较随时间推移的值。
  • 计算自定义日期范围内的值。

有关详细信息,请参阅“场景 - 使用时间智能”一章。

排名和比较值

如果您只想在列或数据透视表中显示前 n 个项目,则有以下选项 -

  • 应用筛选器以仅显示前几个或后几个项目。
  • 创建一个动态排名值并应用筛选器的 DAX 公式。

这些选项各有优缺点。

有关详细信息,请参阅“场景 - 排名和比较值”一章。

Excel DAX - 执行复杂计算

DAX 公式可以执行涉及自定义聚合、筛选和使用条件值的复杂计算。您可以使用 DAX 执行以下操作 -

  • 为数据透视表创建自定义计算。
  • 将筛选器应用于 DAX 公式。
  • 选择性地删除筛选器以创建动态比率。
  • 使用外部循环中的值。

为数据透视表创建自定义计算

DAX 函数 CALCULATE 和 CALCULATETABLE 功能强大且灵活。它们可用于定义计算字段。这些 DAX 函数使您能够更改执行计算的上下文。您还可以自定义要执行的聚合或数学运算的类型。

CALCULATE 函数

CALCULATE (<expression>, [<filter1>], [<filter2>]…)

CALCULATE 函数在由零个或多个指定筛选器修改的上下文中评估给定的表达式。

如果您的数据已被筛选,则 CALCULATE 函数会更改筛选数据的上下文,并在您通过筛选器指定的新的上下文中评估表达式。这意味着,指定列上的任何现有筛选器都将被删除,并改为应用筛选器参数中使用的筛选器。

示例

假设您想按运动项目显示奖牌百分比,并按国家/地区名称进行筛选。您的计算应获取覆盖您在数据透视表中应用于国家/地区的筛选器的百分比值。

  • 定义一个计算字段 - 奖牌计数百分比,如下面的屏幕截图所示。

Calculated Fields

使用此 DAX 公式,CALCULATE 函数将考虑结果表中的所有行,并使用包含 ALL 函数的筛选器。这样,分母中就有总数。

您的数据透视表将如下面的屏幕截图所示。

Row Labels

在上面的屏幕截图中,国家/地区已筛选为美国,并且数据透视表中显示了前 18 个值。接下来,您可以在数据透视表中动态筛选值。但是,由于您使用的自定义 DAX 公式,计算将是正确的。

CALCULATETABLE 函数获取一个值表,并执行与 CALCULATE 函数相同的操作。

在公式中筛选数据

您可以在 DAX 公式中创建筛选器,以选择源数据中的值用于计算。您可以通过定义筛选器表达式并将其与作为 DAX 公式输入的表一起使用来实现。

筛选器表达式使您能够获取源数据的一个子集。每次更新 DAX 公式的结果时,都会动态应用筛选器,具体取决于数据的当前上下文,您可以确保获得准确且预期的结果。

筛选器表达式通常包含一个 DAX 筛选器函数,该函数仅返回表的选定行,然后可以将其用作您用于数据聚合的另一个 DAX 函数的参数。

示例

下面的屏幕截图显示了计算字段的定义,该字段仅提供夏季运动的奖牌计数。

Filtering Data

使用此计算字段,数据透视表将如下面的屏幕截图所示。

Calculated Field Screenshot

如您所见,右侧数据透视表中使用新计算字段的值与左侧数据透视表中显式应用“季节”字段筛选器的值匹配。

注意 - DAX 筛选器和值函数返回一个表,但从不直接将表或行返回到数据模型,因此始终嵌入在另一个 DAX 函数中。

有关这些 DAX 函数的详细信息,请参阅“DAX 筛选器函数”一章。

动态添加和删除筛选器

您在数据透视表中使用的 DAX 公式可能会受到数据透视表上下文的影响。但是,您可以通过添加或删除筛选器来选择性地更改上下文。您可以使用 DAX 函数 ALL 和 ALLEXCEPT 来动态选择行,而不管数据透视表上下文如何。

此外,您可以使用 DAX 函数 DISTINCT 和 VALUES 返回唯一值。

使用外部循环中的值

您可以使用DAX EARLIER 函数在创建一组相关的计算时使用先前循环中的值。此DAX函数最多支持两级嵌套循环。

Excel DAX - 处理文本和日期

DAX可用于处理文本、提取和组合日期和时间值或根据条件创建值的场景。您可以使用DAX执行以下操作:

  • 通过连接创建表中的键列。
  • 基于从文本日期中提取的日期部分组合日期。
  • 定义自定义日期格式。
  • 使用公式更改数据类型。
    • 将实数转换为整数。
    • 将实数、整数或日期转换为字符串。
    • 将字符串转换为实数或日期。

通过连接创建键列

PowerPivot中的数据模型仅允许一个键列。它不支持您可能在外部数据源中找到的复合键。因此,如果数据源中的表中存在任何复合键,则需要将其组合到数据模型中表的单个键列中。

您可以使用DAX函数CONCATENATE将表中数据模型中的两列合并为一列。DAX函数CONCATENATE将两个文本字符串连接成一个文本字符串。连接的项目可以是文本、数字或表示为文本的布尔值,或者这些项目的组合。如果列包含适当的值,您也可以使用列引用。

= CONCATENATE ([Column1], [Column2]) 

DAX CONCATENATE函数仅接受两个参数。如果任何参数不是文本数据类型,则将其转换为文本。DAX CONCATENATE函数返回连接后的字符串。

基于从文本日期中提取的日期部分的日期

Power Pivot中的数据模型支持用于日期和时间值的datetime数据类型。在日期和/或时间值上工作的DAX函数需要datetime数据类型作为参数。

如果您的数据源包含不同格式的日期,则需要首先使用DAX公式提取日期部分,并将这些部分组合以构成有效的DAX datetime数据类型。

您可以使用以下DAX函数来提取和组合日期:

DATE - 以datetime格式返回指定的日期。

DATEVALUE - 将文本形式的日期转换为datetime格式的日期。

TIMEVALUE - 将文本格式的时间转换为datetime格式的时间。

定义自定义日期格式

假设数据源中的日期未以标准格式表示。您可以定义自定义日期格式以确保正确处理这些值。DAX FORMAT函数使您可以根据指定的格式将值转换为文本。

FORMAT (<value>, <format_string>) 

FORMAT函数返回一个包含根据format_string定义的格式化值的字符串。

您可以使用预定义的日期和时间格式,也可以为FORMAT函数的参数format_string创建用户定义的日期和时间格式。

以下是预定义的日期和时间格式名称。如果您使用除这些预定义字符串之外的字符串,则将其解释为自定义日期和时间格式。

序号 Format_String & 描述
1

"常规日期"

显示日期和/或时间。例如,2015年2月10日上午10:10:32

2

"长日期"或"中日期"

根据长日期格式显示日期。例如,2016年3月7日星期三

3

"短日期"

使用短日期格式显示日期。例如,2016年2月3日

4

"长时"

使用长时间格式显示时间。

通常包括小时、分钟和秒。

例如,上午10:10:32

5

"中时"

以12小时格式显示时间。

例如,晚上09:30

6

"短时"

以24小时格式显示时间。

例如,14:15

或者,您可以使用下表中的字符来创建用户定义的日期/时间格式。

序号 字符 & 描述
1

:

时间分隔符。

时间分隔符。在格式化时间值时分隔小时、分钟和秒。

2

/

日期分隔符。

在格式化日期值时分隔日、月和年。

3

%

用于指示应将以下字符读取为单个字母格式,而不管任何尾随字母。还用于指示将单个字母格式读取为用户定义的格式。

以下是各种字符的详细信息。

  • %d - 将日期显示为不带前导零的数字(例如 5)。

  • %dd - 将日期显示为带前导零的数字(例如 05)。

  • %ddd - 将日期显示为缩写(例如 Sun)。

  • %dddd - 将日期显示为完整名称(例如 Sunday)。

  • %M - 将月份显示为不带前导零的数字(例如,一月表示为 1)。

  • %MM - 将月份显示为带前导零的数字(例如,一月表示为 01)。

  • %MMM - 将月份显示为缩写(例如,一月表示为 Jan)。

  • %MMMM - 将月份显示为完整月份名称(例如,一月)。

  • %gg - 显示时期/时代字符串(例如 A.D.)。

  • %h - 使用12小时制显示小时数,不带前导零(例如 1:15:15 PM)。如果这是用户定义的数字格式中的唯一字符,请使用%h

  • %hh - 使用12小时制显示小时数,带前导零(例如 01:15:15 PM)。

  • %H - 使用24小时制显示小时数,不带前导零(例如 13:15:15、1:15:15)。如果这是用户定义的数字格式中的唯一字符,请使用%H。

  • %HH - 使用24小时制显示小时数,带前导零(例如 13:15:15、1:15:15)。

  • %m - 将分钟显示为不带前导零的数字(例如 2:1:15)。如果这是用户定义的数字格式中的唯一字符,请使用 %m。

  • %mm - 将分钟显示为带前导零的数字(例如 2:01:15)。

  • %s - 将秒显示为不带前导零的数字(例如 2:15:5)。如果这是用户定义的数字格式中的唯一字符,请使用 %s。

  • %ss - 将秒显示为带前导零的数字(例如 2:15:05)。

  • %f - 显示秒的小数部分。例如,ff 显示百分之一秒,而ffff 显示万分之一秒。您可以在用户定义的格式中使用最多七个f符号。如果这是用户定义的数字格式中的唯一字符,请使用%f

  • %t - 使用12小时制,并在中午之前的小时数显示大写A;在中午到晚上11:59之间的小时数显示大写P。如果这是用户定义的数字格式中的唯一字符,请使用 %t。

  • %tt - 对于使用12小时制的区域设置,在中午之前的小时数显示大写AM;在中午到晚上11:59之间的小时数显示大写PM。对于使用24小时制的区域设置,不显示任何内容。

  • %y - 显示年份数字(0-9),不带前导零。如果这是用户定义的数字格式中的唯一字符,请使用%y

  • %yy - 以两位数字格式显示年份,如果适用,则带前导零。

  • %yyy - 以四位数字格式显示年份。

  • %yyyy - 以四位数字格式显示年份。

  • %z - 显示时区偏移量,不带前导零(例如 -8)。如果这是用户定义的数字格式中的唯一字符,请使用%z

  • %zz - 显示时区偏移量,带前导零(例如 -08)

  • %zzz - 显示完整的时区偏移量(例如 -08:00)。

如您所见,格式化字符串区分大小写。使用不同的情况可以获得不同的格式。

更改DAX公式输出的数据类型

在DAX公式中,输出的数据类型由源列确定,您不能显式指定结果的数据类型。这是因为Power Pivot会确定最佳数据类型。但是,您可以使用Power Pivot执行的隐式数据类型转换来操作输出数据类型。否则,您可以使用某些DAX函数来转换输出数据类型。

使用隐式数据类型转换

  • 要将日期或数字字符串转换为数字,请乘以1.0。例如,= (TODAY()+5)*1.0。此公式计算当前日期加5天并将结果转换为整数值。

    • 要将日期、数字或货币值转换为字符串,请将该值与空字符串连接起来。例如,= Today() & “”

使用DAX函数进行数据类型转换

您可以使用DAX函数执行以下操作:

  • 将实数转换为整数。
  • 将实数、整数或日期转换为字符串。
  • 将字符串转换为实数或日期。

您将在以下部分学习这一点。

将实数转换为整数

您可以使用以下DAX函数将实数转换为整数:

ROUND (<number>, <num_digits>) - 将数字四舍五入到指定的位数,并返回十进制数。

CEILING (<number>, <significance>) - 将数字向上舍入,舍入到最接近的整数或最接近的significance倍数,并返回十进制数。

FLOOR (<number>, <significance>) - 将数字向下舍入,朝零方向,舍入到最接近的significance倍数,并返回十进制数。

将实数、整数或日期转换为字符串

您可以使用以下DAX函数将实数、整数或日期转换为字符串:

FIXED (<number>, [<decimals>], [<no_comma>]) - 将数字四舍五入并将其结果作为文本返回。小数点右边的位数为2或指定的位数。结果带有逗号或可选地不带逗号。

FORMAT (<value>, <format_string>) - 根据指定的格式将值转换为文本。

您已经了解了如何使用Format函数将日期转换为字符串。

将字符串转换为实数或日期

您可以使用以下DAX函数将字符串转换为实数或日期:

VALUE (<text>) - 将表示数字的文本字符串转换为数字。

DATEVALUE (date_text) - 将文本形式的日期转换为datetime格式的日期。

TIMEVALUE (time_text) - 将文本格式的时间转换为datetime格式的时间。

条件值和错误测试

您可以使用DAX函数测试数据中的值,这些值根据条件产生不同的值。例如,您可以测试每年的销售额,并根据结果将经销商标记为“首选”或“价值”。

您还可以使用DAX函数检查值的范围或类型,以防止意外的数据错误导致计算中断。

根据条件创建值

您可以使用嵌套的IF条件来测试值并有条件地生成新值。以下DAX函数对于条件处理和条件值很有用:

IF (<逻辑表达式>,<真值>, [<假值>]) − 检查条件是否满足。如果条件为 TRUE,则返回一个值;如果条件为 FALSE,则返回另一个值。Value_if_false 是可选的,如果省略且条件为 FALSE,则函数返回 BLANK ()。

OR (<逻辑表达式1>,<逻辑表达式2>) − 检查参数之一是否为 TRUE 以返回 TRUE。如果两个参数均为 FALSE,则函数返回 FALSE。

CONCATENATE (<文本1>, <文本2>) − 将两个文本字符串连接成一个文本字符串。连接的项目可以是文本、数字或布尔值(以文本表示),或这些项目的组合。如果列包含适当的值,您也可以使用列引用。

在 DAX 公式中测试错误

在 DAX 中,您不能在一行的计算列中包含有效值,而在另一行中包含无效值。也就是说,如果计算列的任何部分存在错误,则整个列都将标记有错误,您必须更正 DAX 公式以消除导致无效值的错误。

DAX 公式中的一些常见错误包括:

  • 除以零。
  • 函数的参数为空白,而期望的参数为数值。

您可以结合使用逻辑函数和信息函数来测试错误并始终返回有效值,以避免在计算列中返回错误。以下 DAX 函数可以帮助您实现此目的。

ISBLANK (<值>) − 检查值是否为空白,并返回 TRUE 或 FALSE。

IFERROR (值, 错误值) − 如果第一个参数中的表达式导致错误,则返回错误值。否则,返回表达式本身的值。

表达式的返回值和错误值必须具有相同的类型。否则,您将收到错误。

Excel DAX - 使用时间智能

您已经在“理解时间智能”一章中了解了 DAX 的强大功能时间智能。在本节中,您将学习如何在各种场景中使用 DAX 时间智能函数。

DAX 时间智能函数包括:

  • 帮助您从数据中检索日期或日期范围的函数,这些函数用于计算跨类似时期的值。

  • 处理标准日期间隔的函数,允许您跨月、年或季度比较值。

  • 检索指定期间的第一个和最后一个日期的函数。

  • 帮助您处理期初和期末余额的函数。

计算累计销售额

您可以使用 DAX 时间智能函数创建用于计算累计销售额的公式。以下 DAX 函数可用于计算期末和期初余额:

CLOSINGBALANCEMONTH (<表达式>,<日期>, [<筛选器>]) − 在当前上下文中评估月份最后一天的表达式。

OPENINGBALANCEMONTH (<表达式>,<日期>, [<筛选器>]) − 在当前上下文中评估月份第一天表达式。

CLOSINGBALANCEQUARTER (<表达式>,<日期>, [<筛选器>]) − 在当前上下文中评估季度的最后一天的表达式。

OPENINGBALANCEQUARTER (<表达式>,<日期>, [<筛选器>]) − 在当前上下文中评估季度的第一天表达式。

CLOSINGBALANCEYEAR (<表达式>,<日期>, [<筛选器>], [<年末日期>]) − 在当前上下文中评估年份最后一天的表达式。

OPENINGBALANCEYEAR (<表达式>, <日期>, <筛选器>], [<年末日期>]) − 在当前上下文中评估年份的第一天表达式。

您可以使用以下 DAX 函数创建以下计算字段,以在指定时间获取产品库存:

Month Start Inventory Value: = OPENINGBALANCEMONTH ( 
   SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
) 

Month End Inventory Value: = CLOSINGBALANCEMONTH ( 
   SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
)

Quarter Start Inventory Value: = OPENINGBALANCEQUARTER ( 
   SUMX ProductInventory, (ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
) 

Quarter End Inventory Value: = CLOSINGBALANCEQUARTER ( 
   SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
) 

Year Start Inventory Value: = OPENINGBALANCEYEAR ( 
   SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
)

Year End Inventory Value: = CLOSINGBALANCEYEAR ( 
   SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]), DateTime[DateKey]
) 

跨不同时间段比较值

DAX 支持的默认时间段为月、季和年。

您可以使用以下 DAX 时间智能函数来比较跨不同时间段的总和。

  • PREVIOUSMONTH (<日期>) − 返回一个表,其中包含来自上个月的所有日期的列,基于当前上下文中日期列中的第一个日期。

  • PREVIOUSQUARTER (<日期>) − 返回一个表,其中包含来自上一季度的所有日期的列,基于当前上下文中日期列中的第一个日期。

  • PREVIOUSYEAR (<日期>, <年末日期>]) − 返回一个表,其中包含来自上一年的所有日期的列,基于当前上下文中日期列中的最后一个日期。

您可以使用 DAX 函数创建以下计算字段,以计算在指定时间段内西部地区的销售总额以进行比较:

Previous Month Sales: = CALCULATE ( 
   SUM (WestSales[SalesAmount]), PREVIOUSMONTH (DateTime [DateKey])
) 

Previous Quarter Sales: = CALCULATE ( 
   SUM (WestSales[SalesAmount]), PREVIOUSQUARTER (DateTime [DateKey])
) 

Previous Year Sales: = CALCULATE ( 
   SUM (WestSales[SalesAmount]), PREVIOUSYEAR (DateTime [DateKey])
) 

跨并行时间段比较值

您可以使用 DAX 时间智能函数 PARALLELPERIOD 来比较跨与指定时间段平行的期间的总和。

PARALLELPERIOD (<日期>, <间隔数>, <间隔>)

此 DAX 函数返回一个表,其中包含一列日期,表示与当前上下文中指定日期列中的日期平行的期间,日期向前或向后移动一定数量的间隔。

您可以创建以下计算字段来计算西部地区上一年的销售额:

Previous Year Sales: = CALCULATE ( 
   SUM (West_Sales[SalesAmount]), PARALLELPERIOD (DateTime[DateKey],-1,year)
) 

计算累计总计

您可以使用以下 DAX 时间智能函数来计算累计总计或累计和。

  • TOTALMTD (<表达式>,<日期>, [<筛选器>]) − 在当前上下文中评估表达式在当月至今的值。

  • TOTALQTD (<表达式>,<日期>, <筛选器>]) − 在当前上下文中评估表达式在当季至今的日期的值。

  • TOTALYTD (<表达式>,<日期>, [<筛选器>], [<年末日期>]) − 在当前上下文中评估表达式的当年至今的值。

您可以使用 DAX 函数创建以下计算字段,以计算在指定时间段内西部地区的销售额的累计和:

月累计和:= TOTALMTD (SUM (West_Sales[SalesAmount]), DateTime[DateKey])

季累计和:= TOTALQTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])

年累计和:= TOTALYTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])

在自定义日期范围内计算值

您可以使用 DAX 时间智能函数检索自定义日期集,您可以将其用作 DAX 函数的输入,该函数执行计算以创建跨时间段的自定义聚合。

DATESINPERIOD (<日期>, <开始日期>, <间隔数>, <间隔>) − 返回一个表,其中包含一列日期,从开始日期开始,持续指定的间隔数。

DATESBETWEEN (<日期>, <开始日期>, ) − 返回一个表,其中包含一列日期,从开始日期开始,持续到结束日期。

DATEADD (<日期>,<间隔数>,<间隔>) − 返回一个表,其中包含一列日期,相对于当前上下文中日期,向前或向后移动指定的间隔数。

FIRSTDATE (<日期>) − 返回指定日期列在当前上下文中第一个日期。

LASTDATE (<日期>) − 返回指定日期列在当前上下文中最后一个日期。

您可以使用 DAX 函数创建以下 DAX 公式,以计算指定日期范围内西部地区的销售总额:

  • DAX 公式,用于计算 2016 年 7 月 17 日之前的 15 天的销售额。

CALCULATE ( 
   SUM (WestSales[SalesAmount]), DATESINPERIOD (DateTime[DateKey], DATE(2016,17,14), -15, day)
) 
  • DAX 公式,用于创建一个计算字段,计算 2016 年第一季度的销售额。

= CALCULATE (
   SUM (WestSales[SalesAmount]),DATESBETWEEN (DateTime[DateKey], DATE (2016,1,1), DATE (2016,3,31))
)
  • DAX 公式,用于创建一个计算字段,获取在当前上下文中西部地区首次进行销售的日期。

= FIRSTDATE (WestSales [SaleDateKey]) 
  • DAX 公式,用于创建一个计算字段,获取在当前上下文中西部地区最后一次进行销售的日期。

= LASTDATE (WestSales [SaleDateKey]) 
  • DAX 公式,用于计算比当前上下文中日期早一年的日期。

= DATEADD (DateTime[DateKey],-1,year) 

Excel DAX - 对值进行排名和比较

如果只想在列或数据透视表中显示前 n 个项目,则有以下两种选择:

  • 您可以在数据透视表中选择前 n 个值。

  • 您可以创建一个 DAX 公式,动态对值进行排名,然后在切片器中使用排名值。

应用筛选器以仅显示前几个项目

要选择前 n 个值以在数据透视表中显示,请执行以下操作:

  • 单击数据透视表中行标签标题中的向下箭头。
  • 单击下拉列表中的“值筛选器”,然后单击“前 10 名”。
Applying a Filter

将出现“前 10 名筛选器 (<列名>)”对话框。

  • 在“显示”下,从左到右在框中选择以下内容。
    • 18(要显示的前几个值的个数。默认为 10。)
    • 项目。
    • 在“按”框中,选择“奖牌数”。
Medal Count
  • 单击“确定”。前 18 个值将显示在数据透视表中。

应用筛选器的优缺点

优点

  • 简单易用。
  • 适用于包含大量行的表。

缺点

  • 筛选器仅用于显示目的。

  • 如果数据透视表的基础数据发生变化,则必须手动刷新数据透视表才能查看更改。

创建动态对值进行排名的 DAX 公式

您可以使用包含排名值的 DAX 公式创建计算列。然后,您可以对生成的计算列使用切片器来选择要显示的值。

您可以通过计算同一表中具有大于正在比较的值的行数来获得给定行中给定值的排名值。此方法返回以下结果:

  • 表中最高值的排名值为零。

  • 相等的值将具有相同的排名值。如果 n 个值相等,则相等值后的下一个值的排名值将不连续,增加 n

例如,如果您有一个名为“Sales”的表包含销售数据,则可以创建一个计算列,其中包含“销售额”值的排名,如下所示:

= COUNTROWS (FILTER (Sales,  
   EARLIER (Sales [Sales Amount]) < Sales [Sales Amount])
) + 1 

接下来,您可以在新的计算列上插入切片器,并按排名选择性地显示值。

动态排名的优缺点

优点

  • 排名是在表中完成的,而不是在数据透视表中完成的。因此,可以在任意数量的数据透视表中使用。

  • DAX 公式是动态计算的。因此,即使基础数据发生变化,您也可以始终确保排名是正确的。

  • 由于DAX公式用在计算列中,因此您可以在切片器中使用排名。

  • 适用于包含大量行的表。

缺点

由于DAX计算在计算上代价很高,因此此方法可能不适用于包含大量行的表格。

广告