Excel Dax 简明教程

Excel DAX - Quick Guide

Excel DAX - Overview

DAX 代表数据分析表达式。DAX 是一种公式语言,它是由可以在公式或表达式中使用的函数、运算符和常量组成的集合,可计算并返回一个或多个值。DAX 是与 Excel Power Pivot 的数据模型关联的公式语言。

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

DAX 包含一些用于 Excel 公式的函数,但具有经过修改的功能,另外还有用于处理关系数据和执行动态聚合的其他功能。

Importance of DAX

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

DAX 与数据模型结合,能实现 Excel 中几个强大特性——Power Pivot、Power 透视表、Power 透视图表和 Power View。您可以使用 DAX 解决一系列基础计算和数据分析问题。

DAX 在 Power BI 中也非常有用,用于创建新的 Power BI Desktop 文件并导入一些数据。此外,DAX 公式还提供一些功能,例如分析产品类别的增长百分比,针对不同日期范围计算同比增长与市场趋势相比,以及其他很多功能。

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

Prerequisites for this Tutorial

本教程是 Excel Power Pivot 教程的扩展,您可以在其中了解 Power Pivot 特性、数据模型、关系、Power 透视表、Power 透视图表等。进一步了解本教程将有助于您深入了解 DAX,因为本教程更侧重于 DAX 语言,其中您为数据模型的数据分析编写公式并报告这些结果。

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

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

Calculated Columns

计算列是您可以通过 DAX 公式添加到数据模型中的列。您已经在 Excel Power Pivot教程中了解了它们,但您将在章节——计算列中详细了解,因为 DAX 完全是关于计算列、计算域和 DAX 函数的。

Calculated Fields / Measures

您不能通过编辑更改数据模型中的值。但是,您可以向表中添加可用于 Power 透视表中的计算域。计算域通过赋予名称和定义 DAX 公式来定义。有关更多详细信息,请参阅第二章—— Calculated Fields

在 Excel 2013 之前的 Excel 版本中,计算域被命名为度量。在 Excel 2016 中,它们被重新命名为度量。在本教程中,我们将它们称为计算域。但是,请注意,术语“计算域”和“度量”是同义词,在所有方面都指代同一事物。

在定义并存储计算域之后,您可以对其进行编辑。您可以更改定义中使用的 DAX 公式,也可以重命名计算域。您将从中了解更多信息章节—— Editing a Calculated Field 。您可以删除计算域。请参阅章节—— Deleting a Calculated Field

DAX Formulas

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

DAX 公式包含表、列、计算列、计算域、DAX 运算符和 DAX 函数。有关更多详细信息,请参阅章节—— DAX Formulas

DAX Syntax

正如任何语言一样,公式语言 DAX 也有其语法。您的 DAX 公式应遵循 DAX 语法,否则,您将在设计时或运行时收到错误,或者将收到不正确的结果。

您将在章节—— DAX Syntax 中了解以下内容:

  1. 表的 DAX 命名要求, 列

  2. DAX operators

  3. DAX special values

  4. DAX data types

  5. 隐式数据类型转换

DAX Operators

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

  1. DAX Arithmetic Operators

  2. DAX Comparison Operators

  3. DAX Text Concatenation Operator

  4. DAX Logical Operators

还定义了 DAX 运算符优先级顺序,并且不同于 Excel 运算符优先级顺序。有关更多详细信息,请参阅章节—— DAX Operators

DAX Standard Parameters

DAX 函数语法对参数有特定的要求。这是因为 DAX 函数参数可以是表格、列或计算域或其他 DAX 函数。请参阅第二章 - DAX Standard Parameters

DAX Functions

在 DAX 公式中可以使用 Excel 2013 的 246 个 DAX 函数。您将在本章节中按照类别等级了解这些函数—— DAX Functions 。然而,对于每个 DAX 函数的语法、参数、用法和返回值的详细信息,您必须参考我们的教程—— DAX Functions 。每个 DAX 函数描述中使用的部分名称在章节中给出—— Understanding DAX Functions

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

DAX Special Functions

DAX 有一些函数使 DAX 变得强大。这些 DAX 函数属于类别——DAX 时间智能函数和 DAX 筛选器函数,并要求特别提及。您将在章节中学习 DAX 时间智能函数—— Understanding DAX Time Intelligence 。您将在章节中学习 DAX 筛选器函数的使用—— DAX Filter Functions

DAX Evaluation Context

DAX 公式的结果可能会根据用于求值的上下文而有所不同。DAX 有两种类型的求值上下文——行上下文和筛选器上下文。请参阅章节—— DAX Evaluation Context

DAX Formulas

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

只要刷新数据和重新计算 DAX 公式,DAX 公式的结果就会更改。您必须了解数据刷新和重新计算之间的差异。请参阅章节—— Updating the Results of DAX Formulas

预期数据模型中的数据会随时间而改变。这是因为数据用于数据分析活动,在任何时间点都需要最新数据。要了解刷新数据的不同方式,请参阅章节—— Updating Data in Data Model

您将在章节中了解不同类型的 DAX 公式重新计算—— Recalculating DAX Formulas

DAX 公式重新计算必须考虑数据依赖关系并遵循特定顺序。否则,您可能会遇到错误或错误的结果。请参阅章节—— Troubleshooting DAX Formula Recalculation 了解更多详情。

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

DAX Scenarios

如果您开始学习一门新语言,那么熟悉这门语言的最佳方法是了解在何处使用什么。同样,DAX 作为一种用于数据分析的公式语言,您需要了解可以在其中使用它的各种场景。

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

Excel DAX - Calculated Columns

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

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

Understanding Calculated Columns

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

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

= YEAR ([Date])

YEAR 是一个 DAX 函数,Date 是表中的现有列。如您所见,表名括在括号中。您将在章节 DAX Syntax 中了解更多相关信息。

当您使用此 DAX 公式将列添加到表中时,在创建公式后便会计算列值。将创建一列标题为 CalculatedColumn1 且填入年份值的新列。

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

Creating a Calculated Column

考虑一下数据模型和奥运会结果,如下面的截图所示。

creating calculated column
  1. Click the Data View.

  2. Click the Results tab.

您将查看结果表。

view result table

如上图所示,最右侧列的标题是 – 添加列。

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

  2. 点击列组中的添加。

add column

指针将出现在公式栏中。这意味着您正在添加带有 DAX 公式的列。

  1. 在公式栏中输入 =YEAR ([Date])。

pointer in formula bar

正如在上述截图中看到的,带标题 – 添加列的最右侧列被高亮显示。

  1. Press Enter.

完成计算需要一段时间 (几秒钟)。请稍候。

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

inserted calculated column

如上图所示,新插入的计算列被高亮显示。整个列中的值根据使用的 DAX 公式出现。列标题是 CalculatedColumn1。

Renaming the Calculated Column

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

  1. 双击列标题。列名将被高亮显示。

renaming calculated column
  1. Select the column name.

  2. 输入年份(新名称)。

select column name and type year

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

您还可以通过右键单击该列,然后单击下拉列表中的重命名来重命名计算列。

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

Checking the Data Type of the Calculated Column

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

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

  2. Click the Data Type.

checking data type

正如您在以上截图中看到的,下拉列表具有列可能的数 据类型。在此示例中,选定的是默认(自动)数据类型,即整数。

Errors in Calculated Columns

计算列中可能会出现错误,原因如下 −

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

  2. 公式包含循环或自引用依赖项。

Performance Issues

正如前面在奥运会结果示例中所见,Results 表有大约 35,000 行数据。因此,当您使用 DAX 公式创建列时,已立即在该列中计算了全部 35,000 多个值,这需要一些时间。数据模型和表旨在处理数百万行数据。因此,当 DAX 公式有太多引用时,它可能会影响性能。您可以通过以下操作避免性能问题:

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

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

Excel DAX - Calculated Fields / Measures

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

Understanding Calculated Fields

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

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

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

  1. 计算字段只能用于数据透视表的 VALUES 区域中。

  2. 具有计算结果的计算列还可以在 ROWS、COLUMNS 和 FILTERS 区域中使用。

Saving Calculated Field

计算字段将与它的源表一起保存在数据模型中。它作为表中的一个字段显示在 Power PivotTable 或 Power PivotChart 字段列表中。

Using Calculated Field

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

Calculated Field – An Example

考虑以下奥运会数据的数据模型 −

calculated field

如以上屏幕截图所示,Results 表有一个 Medal 字段,其中包含值 – Gold、Silver 或 Bronze,用于每个包含 Sport – Event - Country – Date 组合的行。假设您想要每个国家的奖牌数,那么您可以使用以下 DAX 公式创建一个计算字段 Medal Count −

Medal Count := COUNTA([Medal])

Creating a Calculated Field in a Table

若要在 Results 表中创建计算字段 Medal Count,请执行以下操作 −

  1. 单击 Results 表中 Medal 列下方的计算区域中的单元格。该单元格将变为高亮显示。

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

creating calculated field in table

按 Enter 键。

press enter

如以上屏幕截图所示,计算字段显示在所选单元格中,显示值为 34,094。这个数字是 Results 表中的总行数。因此,乍一看并没有多大意义。正如前面所讨论的,只有将计算字段添加到 Power PivotTable 或 Power PivotChart 中才能看到它的实际用途。

Using the Calculated Field in a Power PivotTable

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

  1. 在 Power Pivot 窗口中的功能区上单击“数据透视表”。

  2. 在下拉列表中单击“数据透视表”。

using calculated field in power pivottable

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

  1. Click the Existing Worksheet.

  2. 选择您想要放置数据透视表的位置。

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

  1. 在“数据透视表字段”列表中单击“Results”表。

  2. 点击字段 - 国家/地区和奖牌数。

empty pivottable created

如您所见,奖牌数被添加到值区域,国家/地区被添加到行区域。使用国家/地区字段值出现在行中的数据透视表进行创建。并且针对每一行,对奖牌数进行计算和显示。正是以此方式,计算出的字段评估所用的 DAX 公式并显示值。

  1. 将“结果”表中的“运动”字段添加到行区域。

add field sport

正如您在上述屏幕截图中看到的那样,对每个国家/地区计算奖牌数,由运动分类,以及针对国家/地区本身计算一个子总数。

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

Types of Calculated Fields

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

  1. 在 Power数据透视表字段列表窗格中创建一个 implicit calculated field

  2. 在 PowerPivot 窗口中的表中或在 Excel 窗口中的 PowerPivot Ribbon 中创建一个 explicit calculated field

Creating an Implicit Calculated Field

隐式计算字段可以用两种方式创建,都位于 PowerPivot 数据透视表字段窗格中。

Creating an Implicit Calculated Field in the PivotTable Fields List

您可以使用数据透视表字段列表中的奖牌字段创建奖牌数量字段,如下所示 -

  1. 取消选择字段奖牌数。

  2. 右键单击字段奖牌。

  3. 在下拉列表中点击添加到值。

creating implicit calculated field

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

medal column count

Creating an Implicit Calculated Field in the VALUES Area

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

  1. 点击值区域中奖牌数框中的向下箭头。

  2. 在下拉列表中点击值字段设置。

creating implicit calculated field in values area

将出现Value Field Settings对话框。

  1. 在自定义名称框中键入 % 奖牌。

  2. 点击显示值方式选项卡。

  3. 单击“显示值为”下方的框。

  4. 单击“父行总计的百分比”。

value field settings
  1. 单击“数字格式”按钮。

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

  1. Click Percentage.

  2. 在小数位数处键入 0。

  3. Click OK.

  4. 在“值字段设置”对话框中单击“确定”。

  5. 选择“不显示小计”。

format cells dialog box

你创建了另一个隐式计算域“% Medals”,正如你所观察到的,对于每个国家,每一项体育竞技所占的奖牌比例都会显示出来。

Drawbacks of an Implicit Calculated Field

隐式计算域容易创建。事实上,你一直在 Excel 数据透视表和透视图表中创建它们。但是,它们有以下缺点:

  1. They are volatile 。这意味着如果你取消选择你用来计算这个域的域,它将被删除。如果你想要再次显示它,你必须再次创建它。

  2. Their scope is limited 从而创建了数据透视表或透视图表。如果你在另一个工作表中创建另一个数据透视表,你必须再次创建计算域。

另一方面,显式计算域将与数据表一起保存,并且在你选择该数据表时可用。

Creating an Explicit Calculated Field

你可以用两种方式创建显式计算域:

  1. 在数据模型中的数据表计算区。你已经在“在数据表中创建计算域”章节中学到了这一点。

  2. 从 Excel 表中的 PowerPivot 功能区。你将在下一章节学习这种创建显式计算域的方法。

Creating an Explicit Calculated Field from PowerPivot Ribbon

要从 PowerPivot 功能区创建显式计算域,请执行以下步骤:

  1. 单击工作簿中功能区上的 POWERPIVOT 选项卡。

  2. 单击计算区中的“计算域”。

  3. 单击下拉列表中的“新建计算域”。

creating explicit calculated

计算字段对话框出现。

  1. 填写所需信息,如以下屏幕截图所示。

calculated field dialog box
  1. 单击检查公式按钮。

  2. 仅当公式中没有错误时,单击确定。

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

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

Excel DAX - Editing a Calculated Field

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

Finding Calculated Fields

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

  1. 在 Power Pivot 窗口的 Ribbon 上单击高级选项卡。

  2. 单击显示隐式计算字段。

finding calculated fields
  1. Click the Diagram View.

click diagram view

正如您在上述屏幕截图中所看到的,显示隐式计算字段在 Ribbon 上被高亮显示。如果其未被高亮显示,请再次单击它。

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

  1. 取消选中框 - 列、层次结构和 KPI。

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

calculated fields box checked

如上图所示,只有结果表有显示的字段。其他两个表为空白。这表明只有结果表有计算字段。您还可以观察到,隐式计算字段显示一个图标,而显式计算字段 - 奖牌数没有该图标。

Viewing Calculated Fields in the Table

您可以按照如下步骤在表中查看计算字段:

  1. Click the calculated field.

  2. 右键单击并在下拉列表中选择转到。

viewing calculated fields in table

该表将出现在数据视图中。

data view

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

Changing a Calculated Field in the Table

您可以改变表中计算字段使用的公式。

  1. Click the calculated field in the table in data view of the Data Model.

  2. Select the formula in the formula bar – to the right side of :=.

The formula will get highlighted.

formula highlighted
  1. Type the new formula.

  2. Press Enter.

You will learn more about the DAX formulas in the subsequent chapters.

Renaming a Calculated Field in the Data Model

You can change the name of a calculated field in the Data Table either in Data View or Diagram View.

Renaming a Calculated Field in the Data View

  1. Click the calculated field in the table in data view of the Data Model.

  2. Select the calculated field name in the formula bar – to the left side of :=.

The calculated field name will get highlighted.

field name highlighted
  1. Type the new name for the calculated field.

  2. Press Enter.

You will learn more about the DAX Syntax in the subsequent chapters.

Renaming a Calculated Field in the Diagram View

  1. Right-click the calculated field name in the table in the diagram view.

  2. Click Rename in the dropdown list.

renaming calculated field in diagram view

The name will get into editing mode. Type the new name for the calculated field.

Viewing Calculated Fields in the Excel Window

You can view the calculated fields in the Excel window as follows −

  1. 单击功能区上的 POWERPIVOT 选项卡。

  2. Click Calculated Fields in the Calculations group.

  3. 在下拉列表中单击“管理计算字段”。

viewing calculated fields in excel window

Manage Calculated Fields dialog box appears. The names of the explicit calculated fields in the Data Model appear in the dialog box.

manage calculated fields dialog box

Changing a Calculated Field in the Manage Calculated Fields

You can change a calculated field in the Manage Calculated Fields dialog box.

  1. Click the Medal Count.

  2. Click the Edit button.

changing calculated field in manage calculated fields

计算字段对话框出现。

  1. Select the formula to the right of = in the formula box.

calculated field dialog box appear
  1. Type the new Formula.

  2. Click OK.

  3. Click Close in the Manage Calculated Fields dialog box.

Renaming a Calculated Field in the Manage Calculated Fields

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

  1. Click the Medal Count.

  2. Click the Edit button.

计算字段对话框出现。

  1. 在计算字段名称框中选择名称。

renaming calculated field in manage calculated fields
  1. Type the new name for the calculated field.

  2. Click OK.

  3. Click Close in the Manage Calculated Fields dialog box.

Moving a Calculated Field in the Data Model

您可以在创建它的表的计算区域内移动计算字段。但是,它无法移动到其他表。

  1. Right-click the calculated field.

  2. Click Cut.

  3. 将指针移动到同一表的计算区域中的其他位置。

  4. Click Paste.

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

Excel DAX - Deleting a Calculated Field

您可以删除显式和隐式计算字段。有几种方法可以做到这一点,您将在本章中学习这些方法。

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

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

  2. 一个显式计算字段可用于其他显式计算字段的计算中。因此,您需要确保显式计算字段不会用于其他显式计算字段的任何计算中。

  3. 一个隐式计算字段仅限于它所使用的透视表或透视图中。因此,在删除隐式计算字段之前,只需要确保可以从相应的数据透视表或数据透视图中将其删除。

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

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

Deleting an Explicit Calculated Field in the Data Model

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

Deleting an Explicit Calculated Field in the Data View

  1. 在数据视图中的计算区域中找到计算字段。

  2. Right-click the calculated field.

  3. 在下拉列表中单击“删除”。

deleting explicit calculated field in data view

将出现一条消息以进行删除确认。

delete confirmation

单击从模型中删除。将删除显式计算字段。

Deleting an Explicit Calculated Field in the Diagram View

  1. 在图表视图中的数据表中找到计算字段。

  2. 右键单击计算字段名称。

  3. 在下拉列表中单击“删除”。

deleting explicit calculated field in diagram view

将出现一条消息以进行删除确认。

message appears

单击从模型中删除。将删除显式计算字段,并且它将不会出现在数据表的字段列表中。

Deleting an Explicit Calculated Field in the Excel Window

您可以按照以下步骤从 Excel 窗口中删除显式计算字段:

  1. 单击功能区上的 POWERPIVOT 选项卡。

  2. 在“计算”组中单击“计算字段”。

  3. 在下拉列表中单击“管理计算字段”。

deleting explicit calculated field in excel window

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

  1. 单击显式计算字段名称。

  2. Click the Delete button.

manage calculated fields dialog box appear

删除的确认消息出现。

manage calculated fields dialog
  1. 单击“是”。在顶部显示数据模型已更改的信息消息。

  2. 单击对话框中的“关闭”按钮。

change data model

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

Deleting an Implicit Calculated Field

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

Deleting an Implicit Calculated Field in the Data View

  1. 在数据视图中的计算区域中找到计算字段。

  2. Right-click the calculated field.

  3. 在下拉列表中单击“删除”。

deleting implicit calculated field in data view

将出现一条消息以进行删除确认。

implicit calculated field delete confirmation
  1. 单击“从模型中删除”。隐式计算字段将被删除。

Deleting an Implicit Calculated Field in the Diagram View

  1. 在图表视图中的数据表中找到计算字段。

  2. 右键单击计算字段名称。

  3. 在下拉列表中单击“删除”。

deleting implicit calculated field in diagram view

将出现一条消息以进行删除确认。

deleting implicit calculated field confirmation

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

Excel DAX - Syntax

正如前面所讨论的,DAX 是一种由运算符、值、函数和公式组成的公式语言。在本章中,您将了解 DAX 语法。

DAX Syntax 可以分类为 -

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

Differences between Excel Formulas and DAX Formulas

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

Excel Formula

DAX Formula

Excel 公式输入到 Excel 窗口中的公式栏中。

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

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

在 DAX 公式中,您只能引用完整的数据表或列,即引用只能是表和表中的字段;然而,如果您必须仅对部分列数据执行计算,则可以通过 DAX 函数来完成,该函数会筛选并提供用于计算的必需唯一数据值。

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

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

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

DAX 在计算过程中执行隐式数据类型转换。

Excel DAX - Operators

DAX 是一种由函数、运算符和值组成的公式语言,可以用于公式或表达式中,以计算并返回一个或多个值。

您可以使用 DAX operators 来比较值、执行算术计算和连接字符串。在本章中,您将了解 DAX 运算符以及如何使用它们。

DAX Operator Precedence Order

可以使用一个包含多个 DAX 运算符的 DAX 公式,来组合多个值或表达式。在这种情况下,最终结果将取决于执行运算的顺序。DAX 提供了默认运算符优先级顺序以及替代默认优先级顺序的方法。

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

Precedence Order

Operator(s)

Operation

1

^

Exponentiation

2

Sign

3

* and /

Multiplication and Division

4

!

NOT

5

+ and –

Addition and Subtraction

6

&

Concatenation

7

=、<、>、⇐、>= 和 <>

等于、小于、大于、小于或等于、大于或等于和不等于

DAX Expression Syntax

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

  1. 所有表达式都始终以等号 (=) 开头。等号表示后面的字符构成了一个表达式。

  2. 在等号的右边,您将有通过 DAX 运算符连接的操作数。例如,= 5 + 4 > 5.= 5 * 6 - 3。

  3. 表达式始终从左到右读取,并且计算基于上一部分中给出的 DAX 运算符优先级按该顺序进行。

  4. 如果 DAX 运算符具有相同的优先级值,则从左到右求值。例如,=5*6/10。* 和 / 都具有相同的优先级顺序。因此,表达式被求值为 30/10 = 3。

  5. 如果表达式中的 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)。

Using Parentheses to Control DAX Calculation Order

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

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

2 * 5 - 6 * 3 evaluates to -8 with the DAX default operator precedence order. If you use parenthesis to group the operands and operators as = 2 * (5 - 6) * 3, then 5 - 6 is calculated first resulting in -1 and then 2 * (-1) * 3 is calculated which results in -6.

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

Differences Between Excel and DAX

虽然 DAX 与 Excel 公式有相似之处,但两者之间存在一些重要的差异。

  1. 由于 DAX 具有底层内存驻留计算引擎,因此它比 Excel 更加强大。

  2. DAX 支持比 Excel 更多的数据类型。

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

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

  1. Data type casting

  2. Data types

Difference in Data Type Casting

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

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

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

  2. 接下来,DAX 会比较这两个实数。

相反,Excel 会尝试比较不同数据类型的值,而不用首先将这些值强制转换为公共数据类型。由于此原因,您可能会发现在 DAX 和 Excel 中,同一个比较表达式的结果不同。

Difference in Data Types

DAX 和 Excel 中的操作符优先级顺序相同。但是,DAX 不支持 Excel 支持的百分号 (%) 操作符和数据范围。此外,DAX 支持表作为数据类型,而这在 Excel 中不行。

此外,在 Excel 公式中,您可以引用一个单元格,或一个数组或一系列单元格。在 DAX 公式中,您不能引用任何这些。DAX 公式引用到数据时应采用表、列、计算字段和计算列的方式。

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

您将在后面的章节中了解有关所有这些内容的更多信息。

Excel DAX - Standard Parameters

DAX 有 standard parameter 名称,以促进使用和理解 DAX 函数。此外,您可以对参数名称使用某些前缀。如果前缀足够明确,您可以将前缀本身用作参数名称。

Standard Parameter Names

以下为 DAX 的标准参数名称:

Sr.No.

Parameter Name & Description

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 的数据类型的枚举。

Prefixing Parameter Names

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

  1. 前缀应描述如何使用参数。

  2. 应这样设置前缀,以避免参数的模棱两可。

例如,

  1. Result_ColumnName − 指向用于获取 DAX LOOKUPVALUE () 函数中的结果值的现有列。

  2. Search_ColumnName − 指向用于在 DAX LOOKUPVALUE () 函数中搜索值的现有列。

Using Only the Prefix as a Parameter

如果您前缀足够明确,以至于可以描述参数,则可以省略参数名称,仅使用前缀。省略参数名称,仅使用前缀有时有助于避免在阅读时混乱。

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

但是,有时必须存在参数名称和前缀才能使之清晰。

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

Excel DAX - Functions

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

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

在本章中,您将了解 DAX 语言中支持的函数。有关这些 DAX 函数的用法,请参阅本教程库中的教程 - DAX 函数。

What is a DAX Function?

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

Excel Functions vs. DAX Functions

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

Similarities between Excel Functions and DAX Functions

  1. 许多 DAX 函数具有与 Excel 函数相同的名称和相同的一般行为。

  2. DAX 具有类似于 Excel 中数组和矢量查找函数的查找函数。

Differences between Excel Functions and DAX Functions

  1. DAX 函数经过修改以接受不同类型的输入,并且某些 DAX 函数可能会返回不同的数据类型。因此,你需要单独理解这些函数的用法,尽管它们具有相同的名称。在本教程中,你会发现每个 DAX 函数都带有 DAX 前缀,以避免与 Excel 函数混淆。

  2. 你不能在没有必需修改的情况下在 Excel 公式中使用 DAX 函数或在 DAX 中使用 Excel 公式/函数。

  3. Excel 函数采用单元格引用或单元格区域范围作为引用。DAX 函数从不采用单元格引用或单元格区域范围作为引用,而是采用列或表作为引用。

  4. Excel 日期和时间函数返回一个整数,表示一个日期作为一个序列号。DAX 日期和时间函数返回一个在 DAX 中但不在 Excel 中的数据类型 datetime。

  5. Excel 没有返回表格的函数,但某些函数可以处理数组。许多 DAX 函数都可以轻松引用完整的表格和列来执行计算并返回一个表格或一列值。DAX 的这种能力为 Power Pivot、Power View 和使用 DAX 的 Power BI 增加了功能。

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

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

要了解 DAX 数据类型和数据类型转换,请参阅该章节 – DAX 语法参考。

Types of DAX Functions

DAX 支持以下类型的函数。

  1. DAX 表值函数 DAX 筛选器函数 DAX 聚合函数 DAX 时间智能函数

  2. DAX 日期和时间函数

  3. DAX Information Functions

  4. DAX Logical Functions

  5. DAX 数学和三角函数

  6. DAX Other Functions

  7. DAX 父子函数

  8. DAX Statistical Functions

  9. DAX Text Functions

在本节中,你将了解函数类别级别的 DAX 函数。有关 DAX 函数语法以及 DAX 函数返回和执行内容的详细信息,请参阅本教程库中的 DAX 函数教程。

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

DAX Table Valued Functions

许多 DAX 函数将表作为输入或输出表或两者兼而有之。这些 DAX 函数称为 DAX 表值函数。由于表可以具有单列,因此 DAX 表值函数也采用单列作为输入。你具有以下类型的 DAX 表值函数 -

  1. DAX Aggregation functions

  2. DAX Filter functions

  3. DAX Time intelligence functions

了解 DAX 表值函数可帮助你有效地编写 DAX 公式。

DAX Aggregation Functions

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

以下是一些 DAX 聚合函数 -

DAX Filter Functions

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

以下是某些 DAX 筛选器函数 -

DAX Time Intelligence Functions

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

以下是某些 DAX 时间智能函数 -

DAX Date and Time Functions

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

以下是 DAX 日期和时间函数 -

DAX Information Functions

DAX 信息函数查看以参数形式提供的单元格或行,并告知您该值是否与预期类型匹配。

以下是某些 DAX 信息函数 -

DAX Logical Functions

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

以下一些 DAX 逻辑函数 −

DAX Math and Trig Functions

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

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

DAX Other Functions

这些 DAX 函数执行的独特操作无法由其他大多数函数所属的任何类别定义。

以下是一些 DAX 其他函数 −

DAX Parent and Child Functions

DAX 父子函数用于管理以数据模型中父子层次结构呈现的数据。

以下是一些 DAX 父母函数 −

DAX Statistical Functions

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

以下是一些 DAX 统计函数 −

DAX Text Functions

DAX 文本函数适用于表和列。利用 DAX 文本函数,您可以返回字符串の一部、在字符串中查找文本或者串联字符串值。还可以控制日期、时间和数字的格式。

以下是一些 DAX 文本函数 −

Excel DAX - Understanding DAX Functions

在 Excel 2013 中,DAX 具有 246 个函数。您已经在第 – DAX 函数的章节中了解了不同类型的 DAX 函数。但是,如果要在 DAX 公式中使用 DAX 函数,您需要详细理解该函数。您应该知道函数的语法、参数类型、函数的返回值等。

如果您写 DAX 公式,建议在适用情况下使用 DAX 函数。为此,您可以参考本教程库中的教程 – DAX 函数,以深入理解 246 个 DAX 函数各自的使用位置和方式。您始终可以在本教程与 DAX 函数教程之间来回学习,以掌握 DAX。

在本教程中,您会了解如何在 DAX 函数教程中阅读和解读 DAX 函数。

DAX Function – Explanation Structure

在 DAX 函数教程中,每个 DAX 函数都使用标准结构来解析,包括以下部分 −

  1. Description

  2. Syntax

  3. Parameters

  4. Return Value

  5. Remarks

  6. Example

您将在以下教程中学习每一个部分。

Description

在说明部分,您将学习 DAX 函数是什么以及它可以在哪里使用。

Syntax

In the Syntax section, you will learn the exact function name and the respective parameters.

Parameters

在参数部分,您将了解每个 DAX 函数的各个参数,是否为输入或输出参数,是否有任何选项。正如在第 – DAX 标准参数一章中所见,将只使用标准参数名称。

Return Value

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

Remarks

在备注部分,您将了解需要了解的关于 DAX 函数使用情况的任何其他信息。

Example

DAX 函数描述将以函数使用方法的示例结束。

Excel DAX - Evaluation Context

在 DAX 中,上下文是书写 DAX 公式时应注意的重要术语。DAX 上下文也称为 evaluation context ,用于确定 DAX 公式的计算和相应的结果。这意味着 DAX 公式结果可能根据上下文而有所不同。你应该清楚地了解如何使用某个特定 DAX 上下文,以及结果有何不同。

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

当你在 DAX 公式中参考 DAX 函数以进行相关使用时,你需要参考本 DAX 上下文章节,以便清晰理解结果。

Types of Context in DAX

DAX 支持以下计算上下文 −

  1. Row Context

  2. Filter Context

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

Row Context

行上下文指 DAX 公式或 DAX 函数知道它在任何时间点引用的表中的哪行。可以将行上下文视为当前行。公式将针对行上下文逐行计算。

某些 DAX 函数(例如 X 函数、FILTER())和所有计算列均具有行上下文。例如,如果使用 DAX 公式 = YEAR ([Date]) 创建计算列 Year,则将逐行对表中的给定列应用给定的 DAX 公式,从而获取计算列的值。

这意味着,如果已创建计算列,则行上下文将包含每个单独行中的值以及与当前行相关的列中的值,具体取决于所用的 DAX 公式。尽管 DAX 公式不包含对行的引用,但 DAX 在计算值时会隐式了解行上下文。

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

相反,当有 SUMX 等 DAX 函数时,逐行计算的值将被求和,并且仅显示最终结果。也就是说,中间值将被丢弃。

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

Multiple Row Context

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

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

有关示例,请参阅场景 - 创建动态对值进行排名的 DAX 公式一章中的场景 - 排名和比较值。

Filter Context

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

Filter Context Created by a PivotTable

由数据透视表创建的筛选上下文是数据透视表字段通过以下方式进行选择后应用的自然筛选:

  1. Rows

  2. Columns

  3. Filters

  4. Slicers

由数据透视表创建的筛选上下文筛选数据模型中的基础表。如果表相互关联,则筛选器将从查找表向下流向数据表。这意味着,可以根据查找表中的结果筛选数据表。筛选器传播不会以相反的方式传递。但是,可以使用 DAX 公式根据数据表中的结果筛选查找表。

Filter Context Created by DAX Functions

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

Filter Context as an Addition to Row Context

行上下文不会自动创建筛选上下文。可以使用包含 DAX 筛选器函数的 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. 当相关表中存在匹配的数据值时,从主表中删除行。

Updating the Results of DAX Formulas

DAX 公式用于涉及海量数据(包括来自外部数据源的数据)的计算中。此类数据会因 DAX 计算针对实时数据而时常发生改变。

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

  1. Data Refresh − 当刷新数据时。

  2. Recalculation − 当 DAX 公式发生改变时。

Understanding Data Refresh vs. Recalculation

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

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

  2. 重新计算是更新工作簿中所有包含 DAX 公式的列、表格和数据透视表,以反映 DAX 公式本身更改带来的对底层数据更改的过程。

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

Different Ways to Update Data in Data Model

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

  1. 从 Power Pivot 窗口中,您可以以指定的频率手动刷新数据。

  2. 如果您已将工作簿发布到 SharePoint,可以安排自动从外部源刷新数据。

有关这些内容的详细信息,请参阅章节 Updating Data in Data Model

Recalculation of DAX Formulas

DAX 公式的重新计算是一项重要任务,因为在重新计算期间,会检查列依赖关系,如果没有列已更改、数据无效,或者过去可以正常工作的 DAX 公式中出现错误,系统会通知您。

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

  1. 对于计算列,在每次更改 DAX 公式时,始终应重新计算整个列的 DAX 公式的结果。

  2. 对于计算字段,在计算字段置入数据透视表或数据透视图表上下文中之前,不计算 DAX 公式的结果。在您更改影响数据筛选器的任何行或列标题或手动刷新数据透视表时,将重新计算 DAX 公式。

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

要了解有关重新计算的更多信息,请参阅章节—— Recalculating DAX Formulas

Excel DAX - Updating Data in the Data Model

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

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

Different Ways of Updating Data in the Data Model

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

  1. 不时刷新数据模型中的数据。

  2. 对数据源进行更改,例如连接属性。

  3. 在源数据更改后更新数据模型中的数据。

  4. 筛选数据以选择性地加载数据源中表中的行。

Refreshing Data in the Data Model

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

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

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

Manual Refresh

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

Automatic or Scheduled Refresh

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

Manually Refreshing an Existing Data Source

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

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

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

  1. 单击 Power Pivot 窗口功能区上的“主页”选项卡。

  2. Click Refresh.

  3. 在用于刷新所选表格的下拉列表中,单击“刷新”。

  4. 在用于刷新所有表格的下拉列表中,单击“全部刷新”。

manually resfreshing

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

  1. 单击 Power Pivot 窗口功能区上的“主页”选项卡。

  2. 单击“获取外部数据”组中的“现有连接”。

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

  1. Select a connection.

  2. Click the Refresh button.

existing connections

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

有三种可能的结果:

  1. Success − 报告导入到每个表格中的行数。

  2. Error − 如果数据库处于脱机状态,你不再具有权限,则可能会产生错误。在源中删除或重命名表格或列。

  3. Cancelled − 这表示 Excel 未发出刷新请求,可能是因为禁用了连接上的刷新。

possible outcomes

单击“关闭”按钮。

Changing a Data Source

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

你可以对现有数据源进行以下更改:

Connections

  1. 编辑数据库名称或服务器名称。

  2. 更改源文本文件、电子表格或数据源的名称。

  3. 更改数据源的位置。

  4. 对于关系数据源,更改默认目录或初始目录。

  5. 更改访问数据的身份验证方法或凭证。

  6. 编辑数据源上的高级属性。

Tables

  1. 添加或删除数据上的筛选器。

  2. Change the filter criteria.

  3. Add or remove tables.

  4. Change the table names.

  5. 编辑数据源中的表格和数据模型中的表格之间的映射。

  6. 从数据源中选择不同的列。

Columns

  1. Change the column names.

  2. Add new columns.

  3. 从数据模型中删除列(不会影响数据源)。

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

  1. 可以更改连接信息,包括用作源的文件、馈送或数据库,其属性或其他供应商特定的连接选项。

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

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

Modifying a Connection to an Existing Data Source

可以通过更改当前连接所用的外部数据源,来修改到外部数据源中创建的连接。但是,需要遵循的过程取决于数据源类型。

  1. 单击 PowerPivot 窗口中功能区的“主页”选项卡。

  2. 单击“获取外部数据”组中的“现有连接”。

modifying connection

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

根据所更改数据源的类型,供应商可能不同。另外,可用的属性可能需要更改。考虑一个连接到包含数据的 Excel 工作簿的简单示例。

excel workbook contains data
  1. 单击“编辑”按钮。出现“编辑连接”对话框。

  2. 单击“浏览”按钮以定位同一类型的其他数据库(此示例中为 Excel 工作簿),但名称或位置不同。

  3. Click the Open button.

新文件将被选中。会出现一条消息,说明您已修改连接信息,并且需要保存并刷新表以验证连接。

message
  1. 单击“保存”按钮。您将返回“现有连接”对话框。

  2. 单击“刷新”按钮。“刷新数据”对话框出现,显示刷新数据的进度。将显示刷新数据的状态。有关详细信息,请参阅部分 Manually Refreshing an Existing Data Source

  3. 一旦数据刷新成功,请单击“关闭”。

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

Editing Table and Column Mappings (Bindings)

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

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

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

  3. Click the Table Properties.

editing table

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

edit table properties

您可以观察到以下内容 −

  1. 数据模型中选定表的名称显示在“表名称”框中。

  2. 外部数据源中相应表的名称显示在“源名称”框中。

  3. 源名称和模型名称中的列名称有两个选项。

  4. 如果数据源和数据模型中的列的名称不同,您可以通过选择这两组列名在两者之间切换。

  5. 所选表的预览出现在对话框中。

您可以编辑以下内容:

  1. 要更改用作数据源的表,请在“源名称”下拉列表中选择一个与选定的表不同的表。

  2. 如有需要,更改列映射:- 要添加源中存在但在数据模型中不存在的列,请选中列名称旁边的复选框。对要添加的所有列重复此操作。您下次刷新时,实际数据将加载到数据模型中。如果数据模型中的某些列在当前数据源中不再可用,则通知区域中会显示一条消息,其中列出无效的列。您无需进行任何操作。

  3. Click the Save button.

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

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

Changing a Column Name and Data Type

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

  1. 双击列标题。标题中列标题的名称将被高亮显示。

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

  3. 单击其标题选择该列。

  4. Right-click the column.

  5. 单击下拉列表中的“重命名列”。

changing column name

标题中列标题的名称将被高亮显示。输入新的列名称,覆盖旧名称。

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

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

  1. 单击其标题选择您要更改的列。

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

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

check the controls

Adding / Changing a Filter to a Data Source

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

Adding a Filter to a Data Source During Import

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

  1. 单击 Power Pivot 窗口功能区上的“主页”选项卡。

  2. 在“获取外部数据”组中单击一个数据源。

表导入向导对话框出现。

  1. 转到步骤-选择表和视图。

  2. 选择一个表,然后单击“预览与筛选”。

adding a filter to data source

预览选定表对话框将出现。

  1. 单击您想对其应用筛选器的列。

  2. 单击列标题右侧的下箭头。

preview selected table

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

  1. 在列值列表中,选择或清除一个或多个要按其进行筛选的值,然后单击“确定”。但是,如果值的数量特别多,则列表中可能不会显示各个项。相反,您将看到消息 - “有太多项目可显示”。

  2. 单击“数字筛选器”或“文本筛选器”(取决于列的数据类型)。然后,单击其中一个比较运算符命令(如“等于”),或单击“自定义筛选器”。在“自定义筛选器”对话框中,创建筛选器,然后单击“确定”。

@{s0} − 如果您在任何阶段出错,请单击“清除行筛选器”按钮并重新开始。

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

view page

您可以看到,在列“筛选器详细信息”中,应用筛选器链接出现在您定义筛选器的列中。

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

link to view
  1. 单击“完成”导入应用筛选器的文本。

  2. 关闭表导入向导。

Changing a Filter to an Existing Data Source

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

  1. 单击 Power Pivot 窗口功能区上的“主页”选项卡。

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

  3. 单击包含您需要更改筛选器的表的连接。

  4. Click the Open button.

changing a filter

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

Excel DAX - Recalculating DAX Formulas

Recalculation of a DAX formula 要求反映公式本身内数据的更改和更改。但是,重新计算 DAX 公式会产生性能成本。

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

Types of Recalculation

你有两种重新计算 DAX 公式的选项 −

  1. Automatic Recalculation Mode (default)

  2. Manual Recalculation Mode

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

DAX 公式的自动和手动重新计算模式都具有优势。但是,推荐的方式是采用自动重新计算模式。通过这种方式,你可以让 Power Pivot 数据保持同步,并防止因删除数据、名称或数据类型发生更改或缺少依赖关系而造成的问题。

Recalculating DAX Formulas Automatically

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

如下更改始终需要重新计算 DAX 公式 −

  1. 来自外部数据源的值已刷新。

  2. 对 DAX 公式本身进行了更改。

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

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

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

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

  7. 已在表中插入或删除行。

  8. 你应用了一个需要执行查询以更新数据集的筛选器。此筛选器可以应用于 DAX 公式或作为数据透视表或数据透视图的一部分。

When to Use Manual Recalculation Mode?

在工作簿中完成所有必需的 DAX 公式之前,你可以使用手动重新计算模式。通过这种方式,你可以避免在仍然处于草稿状态的工作簿上计算公式结果的成本。

你可以在下列情况下使用 DAX 公式的手动重新计算 −

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

  2. 您知道工作簿中的某些数据已更改,但是您正在使用尚未更改的其他列,因此您希望推迟重新计算。

  3. 您正在处理一个具有许多依赖项的工作簿,并且希望推迟重新计算,直到您确信已进行所有必要的更改。

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

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

  2. 在新计算列中不会出现任何结果。

Configuring the Workbook for Manual Recalculation

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

  1. 单击 Power Pivot 窗口的“开始”选项卡上的“设计”选项卡。

  2. 单击“计算”组中的“计算选项”。

  3. 单击下拉列表中的“手动计算模式”。

workbook for manual recalculation

Recalculating DAX Formulas Manually

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

  1. 单击 Power Pivot 窗口的“开始”选项卡上的“设计”选项卡。

  2. 单击“计算”组中的“计算选项”字段。

  3. 单击下拉列表中的“立即计算”字段。

recalculating dax formulas manually

Troubleshooting DAX Formula Recalculation

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

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

  1. Dependencies

  2. 从属列的重新计算顺序

  3. Transactions

  4. Recalculation of volatile functions

Dependencies

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

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

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

Sequence of Recalculation for Dependent Columns

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

Transactions

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

Recalculation of Volatile Functions

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

只有在重新计算整个列时才重新计算这些 DAX 函数的结果。这些情况包括从外部数据源刷新或手动编辑数据,从而导致重新评估包含这些函数的 DAX 公式。

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

Excel DAX - Formula Errors

使用具有错误语法的 DAX formulas 时,可能会出错。计算字段和计算列可能包含需要特定类型参数的 DAX 函数。DAX 函数的参数可以是表、列或其他 DAX 函数(嵌套 DAX 函数)。由于 DAX 函数可以返回表和列,因此应仔细检查是否将正确类型的参数传递给 DAX 函数。

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

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

DAX Error: Calculation Aborted

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

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

Cause at Run-time

当计算字段带 DAX 时间智能函数被放置在透视表的 VALUES 区域中,但在选择年份之前选择了诸如月份或季度的日期字段作为切片器或筛选器时,可能会显示该错误。例如,如果您有 2014、2015 和 2016 年这三年数据,并且您尝试仅在不选择年字段的情况下使用 3 月份,那么这些值就不是连续的数据值,您将收到错误。

How to Fix the Error at Run-time?

在上面示例中,

  1. 首先将 Year 添加为切片器或筛选器,并选择一个年份。

  2. 然后,将 Month 或 Quarter 添加为切片器或筛选器。

  3. 然后,选择一个或多个月份或季度以筛选或过滤所选年份。

Cause at Design-time

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

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

How to Fix This Error at Design-time?

采取以下措施以在设计时修复该错误−

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

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

  3. 在您的数据模型中创建一个单独的日期表和日期列。将新日期列指定为导致错误的公式中的日期参数。创建日期表并将其添加到数据模型非常容易。

DAX Semantic Error - An Example

以下 DAX 错误是语义错误−

“函数 ‘CALCULATE’ 已用于真假表达式,该表达式用作表筛选器表达式。不允许这样做。”

Cause

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

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

How to Fix Such Errors?

可以通过使用 DAX FILTER 函数将筛选器定义为表表达式(该表表达式随后可以用作 DAX CALCULATE 函数的参数)来修复此类错误。

Excel DAX - Time Intelligence

DAX 有一项重要且强大的功能,称为 Time Intelligence 。时间智能让您可以编写引用时间段的 DAX 公式,以便在数据透视表中使用。

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

Why Time Intelligence Makes DAX Powerful?

时间智能函数处理不断变化的数据,具体取决于您在数据透视表和 Power View 可视化中选择的上下文。正如您所知,大多数数据分析涉及按时间段对数据进行汇总,比较跨时间段的数据值,了解趋势并根据未来预测做出决策。

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

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

Requirements for DAX Time Intelligence Functions

DAX 时间智能函数有特定要求。如果未满足这些要求,您可能会收到错误或它们可能无法正常工作。因此,您还可将这些要求称为规则或限制。以下是某些 DAX 时间智能函数要求/规则/限制 −

  1. 您的数据模型中需要有日期表。

  2. 日期表中必须包括一列,DAX 将其视为日期列。您可以根据需要命名该列,但它应符合以下条件:o 日期列应包含一组连续日期,涵盖您正在分析数据的时段中的每一天。每个日期都必须在日期列中出现一次且仅出现一次。您不能跳过任何日期(例如,您不能跳过周末日期)。

  3. DAX 时间智能函数仅在标准日历上工作,并假设年初为 1 月 1 日,年末为 12 月 31 日,一年中的月份和每月的日期如同日历年。

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

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

DAX Time Intelligence Functions – Categories

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

  1. 返回单个日期的 DAX 函数。

  2. 返回日期表的 DAX 函数。

  3. 评估一段时间内的表达式的 DAX 函数。

DAX Functions That Return a Single Date

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

此类别有 10 个 DAX 函数 −

Sr.No.

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 Functions That Return a Table of Dates

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

此类别有 16 个 DAX 函数。其中 8 个 DAX 函数是“previous”和“next”函数。

  1. “previous”和“next”函数以当前上下文中的日期列开始,并计算前一天、一个月、一个季度或一年。

  2. “previous”函数从当前上下文的第一个日期向后计算,而“next”函数从当前上下文的最后一个日期向前计算。

  3. “previous”和“next”函数以单列表的形式返回结果日期。

Sr.No.

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 函数计算一个时期的日期集。这些函数使用当前上下文中的最后日期执行计算。

Sr.No.

DAX 函数和返回值

1

DATESMTD (Date_Column) 返回一个表格,该表格包含一列日期,表示当前上下文的当月日期。

2

DATESQTD (Date_Column) 返回一个表格,该表格包含一列日期,表示当前上下文的当季日期。

3

DATESYTD (Date_Column, [YE_Date]) 返回一个表格,该表格包含一列日期,表示当前上下文的当年日期。

4

SAMEPERIODLASTYEAR (Date_Column) 返回一个表格,该表格包含一列日期,这些日期比当前上下文中指定 Date_Column 中的日期早一年。 Note − SAMEPERIODLASTYEAR 需要当前上下文包含一组连续的日期,如果当前上下文不是一组连续的日期,则 SAMEPERIODLASTYEAR 将返回一个错误。

  1. 有四个 (4) DAX 函数用于从当前上下文中的日期集移至一组新的日期。这些 DAX 函数比前面的函数更强大,DAX 函数 – DATEADD、DATESINPERIOD 和 PARALLELPERIOD 从当前上下文中移动了一些时间间隔。时间间隔可以是天、月、季度或年,分别由关键词 – DAY、MONTH、QUARTER 和 YEAR 表示。例如:

  2. 向后移动 2 天。

  3. 向前移动 5 个月。

  4. 从今天开始向前移动一个月。

  5. 回到去年同季度。如果函数参数——时间间隔数(整数值)为正数,则向后移动;如果为负数,则向前移动。DAX 函数 – DATESBETWEEN 计算指定起始日期和结束日期之间的日期集。

Sr.No.

DAX 函数和返回值

1

DATEADD (Date_Column, Number_of_Intervals, Interval) 返回一个表格,该表格包含一列日期,这些日期通过从当前上下文中的日期向前或向后移动指定的时间间隔而偏移。

2

DATESINPERIOD (Date_Column, Start_Date, Number_of_Intervals, Interval) 返回一个包含日期列的表,该日期列从 start_date 开始,并持续指定的天数。

3

PARALLELPERIOD (Date_Column, Number_of_Intervals, Interval) 返回一个包含日期列的表,该日期列表示与当前上下文中指定的 Date_Column 中的日期平行的时期,这些日期向前或向后移动一定的天数。

4

DATESBETWEEN (Date_Column, Start_Date, End_Date) 返回一个包含日期列的表,该日期列从 start_date 开始,并持续到 end_date。

DAX Functions that Evaluate Expressions Over a Time Period

此类别中的 DAX 函数在指定的时间段内对表达式求值。

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

  1. 此类别中的三个 (3) 个 DAX 函数可用于在指定的时间段内对任何给定的表达式求值。

Sr.No.

DAX 函数和返回值

1

TOTALMTD (Expression, Date_Column, [SetFilter]) 计算当前上下文中当月至今日期中表达式的值。

2

TOTALQTD (Expression, Date_Column, [SetFilter]) 计算当前上下文中本季度至今日期中表达式的值。

3

TOTALYTD (Expression, Date_Column, [SetFilter], [YE_Date]) 计算当前上下文中本年至今日期中表达式的值。

  1. 此类别中的六 (6) 个 DAX 函数可用于计算期初余额和期末余额。任何时期的期初余额与前一期的期末余额相同。期末余额包含截至该时期结束的所有数据,而期初余额不包含当前时期内的任何数据。这些 DAX 函数总是返回某个特定时间点对表达式求值的值。

  2. 我们关心的时间点始终是日历期间内最后一个可能存在的日期值。

  3. 期初余额基于前一期的最后日期,而期末余额基于当前时期的最后日期。

  4. 当前时期始终由当前日期上下文中最后日期确定。

Sr.No.

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 - Filter Functions

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

Note - 返回表的 DAX 筛选功能不会将该表添加到数据模型中。结果表将用作其他 DAX 函数中的参数。也就是说,此类 DAX 函数用作其他 DAX 函数的嵌套函数。

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

DAX Filter Functions

以下为 DAX 筛选功能:

Sr.No.

DAX 函数及其功能?

1

ADDMISSINGITEMS (&lt;showAllColumn&gt;, [&lt;showAllColumn&gt;] …, &lt;table&gt;, &lt;groupingColumn&gt;, [&lt;groupingColumn&gt;] …, [filterTable] …) 如果不存在,则将来自多个列的项目组合添加到表中。添加哪个项目组合的确定基于引用包含该列所有可能值源列。确定要评估来自不同列的项目组合 -AutoExist 适用于同一表中的列。CrossJoin 适用于不同表。

2

*ALL ( {<table>

<column>, [<column>], [<column>], … })*返回给定表中的所有行或表中指定列中的所有值,而忽略任何可能已应用的筛选器。此函数对于清除筛选器并在表中的所有行上创建计算非常有用。

3

ALLEXCEPT (&lt;table&gt;, &lt;column&gt;, [&lt;column&gt;], …) 移除表中的所有上下文筛选器,但保留已应用于作为参数指定的列的筛选器。与 ALL 相比,当您希望移除表中许多(但不是全部)列上的筛选器时,可以使用此函数。

4

*ALLNOBLANKROW (<table>

<column>)*从关系的父表返回 -所有行但空行,或一列所有不同的值,但空行该函数忽略任何可能存在的上下文筛选器。

5

*ALLSELECTED ( [<tableName>

<columnName>] )*从当前查询中的列和行中移除上下文筛选器,同时保留所有其他上下文筛选器或显式筛选器。

6

CALCULATE (&lt;expression&gt;, [&lt;filter1&gt;, &lt;filter2&gt; …)] 在一个由指定筛选器修改的上下文中求值一个表达式。返回作为表达式结果的值。

7

CALCULATETABLE (&lt;expression&gt;, &lt;filter1&gt;, &lt;filter2&gt;, …) 在一个由给定筛选器修改的上下文中求值一个表表达式。返回一个值表。

8

CROSSFILTER (&lt;columnName1&gt;, &lt;columnName2&gt;, &lt;direction&gt;) 指定用于存在于两列之间的关系的计算的交叉筛选方向。不返回任何值。

9

DISTINCT (&lt;column&gt;) 返回一个包含指定列中不同值的一列表格。换句话说,重复值会被移除,只返回唯一值。结果列在其他 DAX 函数中用作参数。

10

EARLIER (&lt;column&gt;, &lt;number&gt;) 返回由数字指定的外层计算传递中指定列的当前值。

11

EARLIEST (&lt;column&gt;) 返回指定列在外层计算传递中的当前值。

12

FILTER (&lt;table&gt;, &lt;filter&gt;) 只返回筛选行的一个表格。FILTER 仅用作其他需要表格作为参数的函数中的嵌入式函数。

13

FILTERS (&lt;columnName&gt;) 返回直接作为 columnName 筛选器应用的值。FILTERS 仅用作其他需要表格作为参数的函数中的嵌入式函数。

14

HASONEFILTER (&lt;columnName&gt;) 当 columnName 直接筛选值的数量为 1 时,返回 TRUE。否则,返回 FALSE。

15

HASONEVALUE (&lt;columnName&gt;) 当 columnName 的上下文被筛选为一个不同值时,返回 TRUE。否则,返回 FALSE。

16

ISCROSSFILTERED (&lt;columnName&gt;) 当 columnName 或同一表格或相关表格中的另一列被筛选时,返回 TRUE。

17

ISFILTERED (&lt;columnName&gt;) 当 columnName 直接被筛选时,返回 TRUE。如果该列没有筛选器,或者因为同一个表格中的另一个列或相关表格中的另一个列被筛选而发生筛选,那么此函数返回 FALSE。

18

KEEPFILTERS (&lt;expression&gt;) 修改在计算 CALCULATE 或 CALCULATETABLE 函数时筛选器如何应用。

19

RELATED (&lt;column&gt;) 从其他表格返回相关值。

20

RELATEDTABLE (&lt;tableName&gt;) 在由给定筛选器修改的上下文中计算表格表达式。

21

SUBSTITUTEWITHINDEX (&lt;table&gt;, &lt;indexColumnName&gt;, &lt;indexColumnTable&gt;, &lt;orderBy_expression&gt;, [&lt;order&gt;]) 返回表示作为参数提供之两个表的左连接符表格。连接符通过通用列执行,由通用列名称和通用数据类型确定。连接的列用返回表格中的一个单列替换,该列为整数类型,其中包含索引。此索引是按指定排序顺序提供的、与右连接符表格对应的索引。

22

USERELATIONSHIP ( &lt;columnName1&gt;,&lt;columnName2&gt;) 指定在特定计算中要使用 columnName1 与 columnName2 之间的关系。

23

Excel DAX - Scenarios

在之前的章节中,您已了解 DAX 语法、DAX 运算符和 DAX 函数的用法。您可能知道,DAX 是一种用于数据建模和数据分析的公式语言。

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

Performing Complex Calculations

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

  1. 为数据透视表创建自定义计算。

  2. 将筛选器应用于公式。

  3. 有选择地删除筛选器以创建动态比率。

  4. 使用外部循环的值。

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

Working with Text and Dates

DAX 可用于涉及文本处理、提取和组合日期时间值或基于条件创建值的场景。您可以使用 DAX 执行以下操作:

  1. 通过连接创建键列。

  2. 基于从文本日期中提取的日期部分组合日期。

  3. Define a custom date.

  4. 使用公式更改数据类型。将实数转换为整数。将实数、整数或日期转换为字符串。将字符串转换为实数或日期。

有关详细信息,请参阅“场景 - 处理文本和日期”一章。

Conditional Values and Testing for Errors

DAX 函数可以测试数据中的值,并根据条件返回不同的值。测试值的 DAX 函数对于检查值的范围或类型也很有帮助,可防止意外数据错误中断计算。您可以使用 DAX 执行以下操作:

  1. 基于条件创建值。

  2. 测试公式中的错误。

有关详细信息,请参阅“场景 - 条件值和错误测试”一章。

Using Time Intelligence

您已在“了解 DAX 时间智能”一章中了解有关 DAX 时间智能函数的信息。

DAX 时间智能函数包括可以帮助您从数据中检索日期或日期范围的函数。然后,您可以使用这些日期或日期范围计算类似期间的值。时间智能函数还包括使用标准日期间隔的函数,使您能够比较月、年或季度的值。您还可以创建 DAX 公式来比较指定期间内第一个和最后一个日期的值。

您还可以了解有关 DAX intelligence 函数的更多信息以及它们可以用于以下方面的内容:

  1. Calculate Cumulative Sales.

  2. Compare Values over Time.

  3. 计算自定义日期范围的值。

有关详细信息,请参阅“情景 - 使用时间智能”一章。

Ranking and Comparing Values

如果您只想显示列或数据透视表中前面 n 项,您有以下选项:

  1. 应用筛选器仅显示顶部或底部几项。

  2. 创建动态对值进行排序并应用筛选器的 DAX 公式。

每个选项都有利有弊。

有关详细信息,请参阅“情景 - 对值进行排名和比较”一章。

Excel DAX - Performing Complex Calculations

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

  1. 为数据透视表创建自定义计算。

  2. 应用筛选器到 DAX 公式。

  3. 有选择地删除筛选器以创建动态比率。

  4. 使用外部循环的值。

Creating Custom Calculations for a PivotTable

DAX 函数 CALCULATE 和 CALCULATETABLE 功能强大,且灵活。它们对于定义计算域非常有用。这些 DAX 函数让您能够更改执行计算时的上下文。您还可以自定义要执行的聚合或数学运算的类型。

CALCULATE Function

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

CALCULATE 函数在一个由零个或更多指定筛选器修改的上下文中计算给定的表达式。

如果您的数据已过筛选,CALCULATE 函数将更改筛选数据的上下文,并在您通过筛选器指定的新的上下文中计算表达式。这意味着,将删除已指定列上的任何现有筛选器,而改为应用在筛选器自变量中使用的筛选器。

Example

假设您要按国家/地区名称筛选按运动分类的奖牌百分比。您的计算应该获取已覆盖您在数据透视表中对国家/地区应用的筛选器的百分比值。

  1. 定义一个计算域 - 奖牌计数的百分比,如下图所示。

calculated fields

通过这个 DAX 公式,结果表中的所有行都会在 CALCULATE 函数中考虑,其中筛选器包含 ALL 函数。通过这种方式,您在分母中有总数。

您的数据透视表将如下图所示。

row labels

在上面的截图中,将国家/地区筛选为美国,并且在数据透视表中显示了前 18 个值。接下来,您可以在数据透视表中动态筛选值。但是,计算将通过您使用的自定义 DAX 公式来进行更正。

CALCULATETABLE 函数采用一个值表并执行与 CALCULATE 函数相同的操作。

Filtering Data in Formulas

可以在 DAX 公式中创建筛选器,以从源数据中选择用作计算的值。为此,可以通过定义筛选器表达式以及使用作为 DAX 公式输入的表来实现。

筛选器表达式让你可以获取源数据的一个子集。筛选器在每次更新 DAX 公式的结果时会根据数据的当前上下文动态应用,你可以确信获得准确的预期结果。

筛选器表达式通常包含一个返回表中仅选择行的 DAX 筛选器函数,然后此函数可用作正在用于数据聚合的另一个 DAX 函数的参数。

Example

以下屏幕截图显示了仅提供夏季运动奖牌数的计算字段的定义。

filtering data

使用此计算字段后,透视表会显示在下个屏幕截图中。

calculated field screenshot

正如你观察到的那样,带新计算字段的右侧透视表中的值与左侧透视表中的值匹配,左侧透视表明确地将筛选器应用到了赛季字段中。

Note − DAX 筛选器和值函数返回一个表,但从不会将表或行直接返回到数据模型中,因此始终嵌入在另一个 DAX 函数中。

有关这些 DAX 函数的详细信息,请参阅章节 - DAX 筛选器函数。

Adding and Removing Filters Dynamically

在透视表中使用的 DAX 公式可能会受到透视表上下文的影响。然而,可以通过添加或移除筛选器,有选择地更改上下文。你可以使用 DAX 函数 ALL 和 ALLEXCEPT 来动态地选择行,而不管透视表上下文如何。

此外,你可以使用 DAX 函数 DISTINCT 和 VALUES 来返回不同的值。

Using a Value from an Outer Loop

可以使用来自先前循环的一个值来使用 DAX EARLIER 函数创建一组相关计算。此 DAX 函数最多支持两级嵌套循环。

Excel DAX - Working with Text and Dates

DAX 可用于涉及使用文本、提取和组合日期时间值或根据条件创建值的场景中。你可以使用 DAX 做以下事情 -

  1. 通过连接来创建一个表中的键列。

  2. 基于从文本日期中提取的日期部分组合日期。

  3. 定义自定义日期格式。

  4. 使用公式更改数据类型。将实数转换为整数。将实数、整数或日期转换为字符串。将字符串转换为实数或日期。

Creating a Key Column by Concatenation

PowerPivot 中的数据模型仅允许使用一个键列。它不支持可能在外部数据源中找到的复合键。因此,如果数据源中表中存在复合键,你需要将它们合并到数据模型中表中的一个键列中。

可以使用 DAX 函数 CONCATENATE 将两列合并到数据模型中表的单列中。DAX 函数 CONCATENATE 会将两个文本字符串连接成一个文本字符串。连接的项可以是文本、数字或布尔值(表示为文本)或这些项的组合。如果此列包含适当的值,也可以使用列引用。

= CONCATENATE ([Column1], [Column2])

DAX CONCATENATE 函数仅接受两个参数。如果任何参数不是文本数据类型,它将被转换为文本。DAX CONCATENATE 函数返回连接后的字符串。

Date Based on Date Parts Extracted from a Text Date

Power Pivot 中的数据模型支持对日期和时间值使用数据类型 datetime。对日期和/或时间值起作用的 DAX 函数需要对参数使用 datetime 数据类型。

如果数据源包含不同格式的日期,你需要首先使用 DAX 公式提取日期部分,并将这些部分组合以构成一个有效的 DAX 日期时间数据类型。

你可以使用以下 DAX 函数来提取和组合日期:

DATE - 返回日期时间格式的指定日期。

DATEVALUE - 将文本格式的日期转换为日期时间格式的日期。

TIMEVALUE - 将文本格式的时间转换为日期时间格式的时间。

Defining a Custom Date Format

假设数据源中的日期未以标准格式表示。你可以定义自定义日期格式,以确保正确处理值。DAX FORMAT 函数使你能够根据指定格式将值转换为文本。

FORMAT (<value>, <format_string>)

FORMAT 函数返回一个字符串,其中包含按 format_string 定义的格式化值。

你可以使用预定义的日期和时间格式,也可以为 FORMAT 函数的参数 format_string 创建用户定义的日期和时间格式。

以下是预定义的日期和时间格式名称。如果你使用除以下这些预定义字符串之外的字符串,它们将被解释为自定义日期和时间格式。

S. No.

Format_String & Description

1

"General Date" 显示日期和/或时间。例如,2/10/2015 10:10:32 AM

2

"Long Date" or "Medium Date" 根据长日期格式显示日期。例如,2016 年 3 月 7 日星期三

3

"Short Date" 使用短日期格式显示日期。例如,2/03/2016

4

"Long Time" 使用长时间格式显示时间。通常包括小时、分钟和秒。例如,上午 10:10:32

5

"Medium Time" 使用 12 小时格式显示时间。例如,下午 09:30

6

"Short Time" 使用 24 小时格式显示时间。例如,14:15

或者,你可以使用下表中的字符来创建用户定义的日期/时间格式。

S. No.

Character & Description

1

: 时间分隔符。时间分隔符。在格式化时间值时,分隔小时、分钟和秒。

2

/ 日期分隔符。在格式化日期值时,分隔日、月和年。

3

% 用于指示应将以下字符当作单字母格式来读,而不考虑任何尾随字母。还用于指示将单字母格式读作用户定义的格式。

以下是各个字符的详细信息。

  1. %d − 显示日,没有前导零(例如 5)。

  2. %dd − 显示日,有前导零(例如 05)。

  3. %ddd − 显示日的缩写(例如星期日)。

  4. %dddd − 显示日的全名(例如星期日)。

  5. %M − 显示月,没有前导零(例如 1 月表示为 1)。

  6. %MM − 显示月,有前导零(例如 1 月表示为 01)。

  7. %MMM − 显示月的缩写(例如 1 月表示为 1 月)。

  8. %MMMM − 显示月的全名(例如 1 月)。

  9. %gg − 显示期限/时代字符串(例如公元)。

  10. %h − 显示小时,没有前导零,使用 12 小时制(例如下午 1:15:15)。如果这是用户定义的数字格式中的唯一字符,请使用 %h

  11. %hh − 显示小时,有前导零,使用 12 小时制(例如下午 01:15:15)。

  12. %H − 显示小时,没有前导零,使用 24 小时制(例如 13:15:15、1:15:15)。如果这是用户自定义数值格式中的唯一字符,请使用 %H。

  13. %HH − 显示小时,有前导零,使用 24 小时制(例如 13:15:15、1:15:15)。

  14. %m − 显示分钟,没有前导零(例如 2:1:15)。如果这是用户定义的数字格式中的唯一字符,请使用 %m。

  15. %mm − 显示分钟,有前导零(例如 2:01:15)。

  16. %s − 显示秒,没有前导零(例如 2:15:5)。如果这是用户定义的数字格式中的唯一字符,请使用 %s。

  17. %ss − 显示秒,有前导零(例如 2:15:05)。

  18. %f − 显示秒的小数部分。例如, ff 显示百分之一秒,而 ffff 显示一万分之一秒。你可以在用户自定义的格式中使用最多 7 个 f 符号。如果这是用户自定义数值格式中的唯一字符,请使用 %f

  19. %t − 使用 12 小时制,并在午夜之前的小时中显示大写 A;并在中午至晚上 11:59 之间的小时中显示大写 P。如果这是用户定义的数字格式中唯一的字符,请使用 %t。

  20. %tt − 对于使用 12 小时制的区域,在午夜之前的小时中显示大写 AM;在中午至晚上 11:59 之间的小时中显示大写 PM。对于使用 24 小时制的区域,不显示任何内容。

  21. %y − 显示没有前导零的年份(0-9)。如果这是用户定义的数字格式中唯一的字符,请使用 %y

  22. %yy − 以两位数字格式显示年份,如有必要,则带有前导零。

  23. %yyy − 以四位数字格式显示年份。

  24. %yyyy − 以四位数字格式显示年份。

  25. %z − 显示没有前导零的时区偏移量(例如 -8)。如果这是用户定义的数字格式中唯一的字符,请使用 %z

  26. %zz − 显示带有前导零的时区偏移量(例如 -08)

  27. %zzz − 显示完整的时区偏移量(例如 -08:00)。

正如您所观察到的,格式化字符串区分大小写。可以通过使用不同的情况来获取不同的格式。

Changing Data Types of DAX Formula Outputs

在 DAX 公式中,输出的数据类型由源列决定,并且您不能明确指定结果的数据类型。这是因为最佳的数据类型由 Power Pivot 决定。然而,您可以使用 Power Pivot 执行的隐式数据类型转换来操作输出数据类型。否则,可以使用某些 DAX 函数转换输出数据类型。

Using the Implicit Data Type Conversions

  1. 要将日期或数字字符串转换为数字,请乘以 1.0。例如,=(TODAY()+5)*1.0。此公式计算当前日期加上 5 天,并将结果转换为整数值。要将日期、数字或货币值转换为字符串,请将该值与空字符串连接。例如,=Today() & “”

Using the DAX Functions for Data Type Conversions

您可以将 DAX 函数用于以下内容 −

  1. 将实数转换为整数。

  2. 将实数、整数或日期转换为字符串。

  3. 将字符串转换为实数或日期。

您将在以下部分学习这一点。

Converting Real Numbers to Integers

您可以使用以下 DAX 函数将实数转换成整数−

ROUND (<number>, <num_digits>) − 将数字舍入到指定位数,并返回一个十进制数。

CEILING (<number>, <significance>) − 将数字向上舍入,至最接近的整数或最接近的显着倍数,并返回一个十进制数。

FLOOR (<number>, <significance>) − 将数字向下舍入(舍入到零),至最接近的显着倍数,并返回一个十进制数。

Converting Real Numbers, Integers, or Dates to Strings

您可以使用以下 DAX 函数将实数、整数或日期转换成字符串−

FIXED (<number>, [<decimals>], [<no_comma>]) − 舍入一个数字并返回结果的文本。小数点右边的位数为 2 或指定的小数位数。结果带有逗号或可选地不带逗号。

FORMAT (<value>, <format_string>) − 根据指定的格式将值转换为文本。

您已经了解了如何使用“Format”函数将日期转换为字符串。

Converting Strings to Real Numbers or Dates

您可以使用以下 DAX 函数将字符串转换成实数或日期−

VALUE (<text>) − 将表示数值的文本字符串转换为数字。

DATEVALUE (date_text) − 将文本格式的日期转换为日期时间格式的日期。

TIMEVALUE (time_text) − 将文本格式的时间转换为日期时间格式的时间。

Conditional Values and Testing for Errors

您可以使用 DAX 函数测试数据中的值,并根据条件得到不同的值。例如,您可以测试年销售额,并根据结果,将经销商标注为首选或价值。

您还可以使用 DAX 函数检查值范围或类型,以防止意外数据错误中断计算。

Creating a Value Based on a Condition

您可以使用嵌套的“IF”条件来测试值和有条件地生成新值。以下 DAX 函数适用于条件处理和条件值−

IF (<logical_test>,<value_if_true>, [<value_if_false>]) − 检查是否满足一个条件。如果条件为真,则返回一个值;如果条件为假,则返回另一个值。“Value_if_false”是可选的,如果省略且条件为假,则该函数返回 BLANK ()。

OR (<logical1>,<logical2>) − 检查其中一个参数是否为真来返回真。如果两个参数都为假,则该函数返回假。

CONCATENATE (<text1>, <text2>) − 将两个文本字符串连接成一个文本字符串。连接项可以是文本、数字或表示为文本的布尔值或这些项的组合。如果该列包含适当的值,您还可以使用列引用。

Testing for Errors within a DAX Formula

在 DAX 中,您不能在一行的计算列中具有有效值,而在另一行中具有无效值。也就是说,如果计算列的任何部分发生错误,则整个列都会被标记为错误,您必须更正 DAX 公式以消除导致无效值的错误。

DAX 公式中的一些常见错误:

  1. Division by zero.

  2. 函数的参数为空白,而预期的参数是数值。

您可以结合使用逻辑函数和信息函数来测试错误,并始终返回有效值,以避免在计算列中返回错误。以下 DAX 函数可以帮助您解决此问题。

ISBLANK (<value>) - 检查值是否为空白,并返回 TRUE 或 FALSE。

IFERROR (value, value_if_error) - 如果第一个参数中的表达式导致错误,则返回 value_if_error。否则,返回表达式本身的值。

表达式的返回值和 value_if_error 都必须具有相同的数据类型。否则,您将收到一条错误消息。

Excel DAX - Using Time Intelligence

您已在“理解时间智能”一章中了解了 DAX 强大的功能时间智能。在此章节中,您将学习如何在各种场景中使用 DAX 时间智能函数。

DAX 时间智能函数包括:

  1. 用于帮助您从数据中检索日期或日期范围的函数,可用于计算类似期间的值。

  2. 与标准日期区间一起使用的函数,以便您比较不同月份、年份或季度的值。

  3. 检索指定期间的第一天和最后一天的函数。

  4. 帮助您处理期初和期末余额的函数。

Calculating Cumulative Sales

您可以使用 DAX 时间智能函数创建公式来计算累计销售额。以下 DAX 函数可用于计算期末和期初余额:

CLOSINGBALANCEMONTH (<expression>,<dates>, [<filter>]) - 在当前上下文中,该函数在该月份的最后一天对表达式求值。

OPENINGBALANCEMONTH (<expression>,<dates>, [<filter>]) - 在当前上下文中,该函数在该月份的第一天对表达式求值。

CLOSINGBALANCEQUARTER (<expression>,<dates>, [<filter>]) - 在当前上下文中,该函数在该季度的最后一天对表达式求值。

OPENINGBALANCEQUARTER (<expression>,<dates>, [<filter>]) - 在当前上下文中,该函数在该季度的第一对表达式求值。

CLOSINGBALANCEYEAR (<expression>,<dates>, [<filter>], [<year_end_date>]) - 在当前上下文中,该函数在该年份的最后一天对表达式求值。

OPENINGBALANCEYEAR (<expression>, <dates>, <filter>], [<year_end_date>]) - 在当前上下文中,该函数在该年份的第一天对表达式求值。

You can create the following calculated fields for the product inventory at a specified time by using the following DAX functions −

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]
)

Comparing Values across Different Time Periods

The default time periods supported by DAX are months, quarters, and years.

You can use the following DAX time intelligence functions to compare the sums across different time periods.

  1. PREVIOUSMONTH (<dates>) − Returns a table that contains a column of all the dates from the previous month, based on the first date in the dates column, in the current context.

  2. PREVIOUSQUARTER (<dates>) − Returns a table that contains a column of all the dates from the previous quarter, based on the first date in the dates column, in the current context.

  3. PREVIOUSYEAR (<dates>, <year_end_date>]) − Returns a table that contains a column of all dates from the previous year, given the last date in the dates column, in the current context.

You can create the following calculated fields for calculating sum of sales in the West region at the specified time periods for comparison, by using the DAX functions −

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])
)

Comparing Values Across Parallel Time Periods

You can use the DAX time intelligence function PARALLELPERIOD to compare the sums across a period parallel to the specified time period.

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

This DAX function returns a table that contains a column of dates representing a period parallel to the dates in the specified dates column, in the current context, with the dates shifted a number of intervals either forward or backward in time.

You can create the following calculated field for calculating the previous year’s sales in West region −

Previous Year Sales: = CALCULATE (
   SUM (West_Sales[SalesAmount]), PARALLELPERIOD (DateTime[DateKey],-1,year)
)

Calculating Running Totals

You can use the following DAX time intelligence functions to calculate running totals or running sums.

  1. TOTALMTD (<expression>,<dates>, [<filter>]) − Evaluates the value of the expression for the month to date in the current context.

  2. TOTALQTD (<expression>,<dates>, <filter>]) − Evaluates the value of the expression for the dates in the quarter to date, in the current context.

  3. TOTALYTD (<expression>,<dates>, [<filter>], [<year_end_date>]) − Evaluates the year-to-date value of the expression in the current context.

You can create the following calculated fields for calculating running sum of sales in the West region at specified time periods, by using the DAX functions −

Month Running Sum: = TOTALMTD (SUM (West_Sales[SalesAmount]), DateTime[DateKey])

Quarter Running Sum: = TOTALQTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])

Year Running Sum: = TOTALYTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])

Calculating a Value over a Custom Date Range

使用 DAX 时间智能函数可以检索一组自定义日期,你可将其用作 DAX 函数的输入,从而执行计算,以跨时间段创建自定义聚合。

DATESINPERIOD (<dates>, <start_date>, <number_of_intervals>, <interval>) − 返回一个表,其中包含一列从 start_date 开始并持续指定 number_of_intervals 个时间间隔的日期。

DATESBETWEEN (<dates>, <start_date>, ) − 返回一个表,其中包含一列从 start_date 开始并持续到 end_date 的日期。

DATEADD (<dates>,<number_of_intervals>,<interval>) − 返回一个表,其中包含一列日期,从当前上下文的日期中向前或向后移动指定时间间隔数。

FIRSTDATE (<dates>) − 返回当前上下文中指定日期列中的第一个日期。

LASTDATE (<dates>) − 返回当前上下文中指定日期列中的最后一个日期。

通过使用 DAX 函数,可以创建以下用于计算指定日期范围内西区销售总和的 DAX 公式 −

  1. 计算 2016 年 7 月 17 日前 15 天销售额的 DAX 公式。

CALCULATE (
   SUM (WestSales[SalesAmount]), DATESINPERIOD (DateTime[DateKey], DATE(2016,17,14), -15, day)
)
  1. 创建计算字段以计算 2016 年第一季度销售额的 DAX 公式。

= CALCULATE (
   SUM (WestSales[SalesAmount]),DATESBETWEEN (DateTime[DateKey], DATE (2016,1,1), DATE (2016,3,31))
)
  1. 创建计算字段以获取当前上下文中在西区进行销售时的第一个日期的 DAX 公式。

= FIRSTDATE (WestSales [SaleDateKey])
  1. 创建计算字段以获取当前上下文中在西区进行销售时的最后一个日期的 DAX 公式。

= LASTDATE (WestSales [SaleDateKey])
  1. 计算当前上下文中日期前一年的日期的 DAX 公式。

= DATEADD (DateTime[DateKey],-1,year)

Excel DAX - Ranking and Comparing Values

如果你只想显示一列或数据透视表中前 n 个项目,则有以下两个选项 −

  1. 您可以在数据透视表中选择 n 个排名前的值。

  2. 你可以创建一个 DAX 公式,对值进行动态排名,然后在切片器中使用排名值。

Applying a Filter to Show only the Top Few Items

若要选择 n 个排名前的值在数据透视表中显示,请执行以下操作 −

  1. 单击数据透视表中行标签标题中的向下箭头。

  2. 单击下拉列表中的“值筛选器”,然后单击“前 10”。

applying a filter

出现“前 10 筛选器 (<column name>)”对话框。

  1. 在“显示”下,从左到右在框中选择以下内容。Top18(要显示的顶级值的数目。默认为 10)。项目。在“依”框中,选择“奖牌数”。

medal count
  1. 单击确定。数据透视表中将显示排名前 18 位的值。

Advantages and Disadvantages of Applying Filter

Advantages

  1. 简单易用。

  2. 适合行数较多的表格。

Disadvantages

  1. 过滤器仅用于显示目的。

  2. 如果数据透视表底层数据发生变化,必须手动刷新数据透视表才能查看更改。

Creating a DAX Formula That Dynamically Ranks Values

可以使用包含已排序值的 DAX 公式创建计算列。然后,可以在 resulting 计算列上使用切片器来选择要显示的值。

可以根据行中某个给定值的较大值通过计算同个表格中值大于该值的行数来获得排序值。此方法返回以下内容

  1. 对于表格中值最大的值为零。

  2. 相同值将有相同的排序值。如果 n 个值相等,则在相同值之后的下一个值将是 n 个值的非连续排序值之和。

例如,如果你有一个带有销售数据的“Sales”表格,你可以创建一个计算列,按照销售金额值的排序如下创建

= COUNTROWS (FILTER (Sales,
   EARLIER (Sales [Sales Amount]) < Sales [Sales Amount])
) + 1

接下来,你可以在新的计算列上插入切片器并按排序选择性地显示值。

Advantages and Disadvantages of Dynamic Ranks

Advantages

  1. 排序在表格中进行,而不在数据透视表中进行。因此,可以在任意数量的数据透视表中使用它。

  2. DAX 公式会进行动态计算。因此,即使底层数据已更改,也可以始终确保排序正确。

  3. 因为 DAX 公式是在计算列中使用的,所以可以在切片器中使用排序。

  4. 适合行数较多的表格。

Disadvantages

因为 DAX 计算对于计算来说过于昂贵,所以此方法可能不适合行数较多的表格。