Excel DAX – 快速指南
Excel DAX – 快速指南
Excel DAX – 概述
DAX代表d ATA一nalysisé X 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 PivotTables、Power PivotCharts 和 Power View。您可以使用 DAX 解决许多基本计算和数据分析问题。
DAX 在 Power BI 中也可用于创建新的 Power BI Desktop 文件并将一些数据导入其中。此外,DAX 公式还提供多种功能,例如分析跨产品类别和不同日期范围的增长百分比、计算与市场趋势相比的同比增长以及许多其他功能。
学习如何创建有效的 DAX 公式将帮助您充分利用数据。当您获得所需的信息时,您就可以开始解决影响您的底线的实际业务问题。这就是 Power BI 的强大功能,而 DAX 将帮助您实现目标。
本教程的先决条件
本教程是 Excel Power Pivot 教程的扩展,您在其中了解了 Power Pivot 功能、数据模型、关系、Power PivotTables、Power Pivot Charts 等。在深入研究之前,最好先复习一下本教程进入 DAX,因为本教程更多地介绍 DAX 语言,您可以在其中编写用于分析数据模型中的数据的公式并报告这些结果。
本教程还介绍了类似于 Excel 函数的 DAX 函数,但有一些变化。提供了 Excel 函数和 DAX 函数的比较以帮助您区分两者。同样,比较Excel公式和DAX公式,讨论异同。充分理解这些差异将有助于您高效地编写有效的 DAX 公式。
本教程不需要 Excel 函数和 Excel 公式的知识,因为 DAX 完全适用于 Power Pivot 窗口中的数据模型。您将进入 Excel 工作表只是为了查看基于数据模型的 Power PivotTables、Power Pivot Charts 和 Power View 可视化。但是,如果您是 Excel 专业人士,对 Excel 函数和公式有丰富的知识,最好记下上一节中提到的内容以及本教程中给出的详细信息。
计算列
计算列是您可以通过 DAX 公式添加到数据模型中的表的列。您已经在 Excel Power Pivot 教程中了解了它们,但您将在章节 – 计算列作为 DAX 中详细了解它们是关于计算列、计算字段和 DAX 函数。
计算字段/度量
您不能通过编辑来更改数据模型中表中的值。但是,您可以将计算字段添加到可在 Power 数据透视表中使用的表。计算字段通过提供名称和定义 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 运算符优先顺序,并且与 Excel 运算符优先顺序不同。请参阅“ 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 是一种用于数据分析的公式语言,您需要了解可以使用它的各种场景。
请参阅以下章节以获取有关此内容的详细信息。
Excel DAX – 计算列
甲计算列是列您通过一个DAX公式定义的列值的手段添加到你的工作簿的数据模型的现有的表。您不是导入列中的值,而是创建计算列。
您可以在数据透视表、数据透视图、Power PivotTable、Power PivotChart 或 Power View 报表中使用计算列,就像任何其他表列一样。
了解计算列
用于创建计算列的 DAX 公式类似于 Excel 公式。但是,在 DAX 公式中,您不能为表中的不同行创建不同的公式。DAX 公式会自动应用于整个列。
例如,您可以创建一个计算列来从现有列中提取年份 – 日期,使用 DAX 公式 –
= YEAR ([Date])
YEAR 是 DAX 函数,Date 是表中的现有列。如所见,表名括在方括号中。您将在DAX 语法一章中了解更多相关信息。
使用此 DAX 公式向表中添加列时,将在您创建公式后立即计算列值。将创建一个标题为 CalculatedColumn1 的新列,其中填充了 Year 值。
根据需要重新计算列值,例如在刷新基础数据时。您可以基于现有列、计算字段(度量)和其他计算列创建计算列。
创建计算列
考虑具有奥运会结果的数据模型,如下面的屏幕截图所示。
- 单击数据视图。
- 单击结果选项卡。
您将查看结果表。
如上图所示,最右边的列有标题 – 添加列。
- 单击功能区上的设计选项卡。
- 单击列组中的添加。
指针将出现在公式栏中。这意味着您要添加带有 DAX 公式的列。
- 在公式栏中键入 =YEAR ([Date])。
从上面的屏幕截图中可以看出,最右边的带有标题的列 – 添加列被突出显示。
- 按 Enter。
完成计算需要一段时间(几秒钟)。请稍等。
新的计算列将插入到最右边的添加列的左侧。
如上图所示,新插入的计算列高亮显示。整列中的值按照使用的 DAX 公式显示。列标题是CalculatedColumn1。
重命名计算列
要将计算列重命名为有意义的名称,请执行以下操作 –
- 双击列标题。列名称将突出显示。
- 选择列名。
- 键入 Year(新名称)。
如上图所示,计算列的名称已更改。
您还可以通过右键单击计算列,然后单击下拉列表中的重命名来重命名计算列。
只需确保新名称与表中的现有名称不冲突。
检查计算列的数据类型
您可以按如下方式检查计算列的数据类型 –
- 单击功能区上的“主页”选项卡。
- 单击数据类型。
正如您在上面的屏幕截图中看到的,下拉列表具有列的可能数据类型。在本例中,选择了默认(自动)数据类型,即整数。
计算列中的错误
由于以下原因,计算列中可能会出现错误 –
-
更改或删除表之间的关系。这是因为使用这些表中的列的公式将变得无效。
-
该公式包含循环或自引用依赖项。
性能问题
正如之前在奥运会结果示例中看到的那样,结果表有大约 35000 行数据。因此,当您使用 DAX 公式创建列时,它一次计算了该列中的所有 35000+ 个值,这需要一些时间。数据模型和表旨在处理数百万行数据。因此,当 DAX 公式有太多引用时,它会影响性能。您可以通过以下方式避免性能问题 –
-
如果您的 DAX 公式包含许多复杂的依赖项,请分步创建它,将结果保存在新的计算列中,而不是一次创建一个大公式。这使您能够验证结果并评估性能。
-
发生数据修改时,需要重新计算计算列。您可以将重新计算方式设置为手动,从而节省频繁的重新计算。但是,如果计算列中的任何值不正确,该列将灰显,直到您刷新并重新计算数据。
Excel DAX – 计算字段/度量
甲计算的字段中的数据模型的表是由一个DAX公式获得的字段。在 Power Pivot 的早期版本中,计算字段被称为度量。在 Excel 2013 中,它被重命名为计算字段。但是,它在 Excel 2016 中重新命名为测量。如果您参考任何文档,您可以观察到这两个术语的混淆。请注意,术语计算字段和度量是同义词。在本教程中,我们使用术语计算字段。
了解计算字段
计算字段是专门为在数据透视表(或数据透视图)中使用而创建的公式。
您可以基于标准聚合函数(例如 COUNT 或 SUM)或通过定义您自己的 DAX 公式来创建计算字段。
以下是计算字段和计算列之间的差异 –
-
计算字段只能用于数据透视表的 VALUES 区域。
-
带有计算结果的计算列也可用于 ROWS、COLUMNS 和 FILTERS 区域。
保存计算字段
计算字段将与其源表一起保存在数据模型中。它在 Power PivotTable 或 Power PivotChart Fields 列表中显示为表中的一个字段。
使用计算字段
要使用计算字段,您必须从 Power PivotTable Fields 列表中选择它。计算字段将被添加到 VALUES 区域,并且将评估用于计算字段的公式。为每个行和列字段组合创建一个结果。
计算字段 – 示例
考虑以下奥运会数据的数据模型 –
如上面的屏幕截图所示,结果表有一个字段 Medal,其中包含值 – Gold、Silver 或 Bronze,用于包含 Sport – Event – Country – Date 组合的每一行。假设您想要每个国家/地区的奖牌数,那么您可以使用以下 DAX 公式创建一个计算字段奖牌数 –
Medal Count := COUNTA([Medal])
在表中创建计算字段
要在结果表中创建计算字段奖牌计数,请执行以下操作 –
-
单击“结果”表中“奖牌”列下方计算区域中的单元格。该单元格将突出显示。
-
在公式栏中键入奖牌计数:=COUNTA([Medal])。
按 Enter。
如上图所示,计算字段出现在所选单元格中,显示值为 34,094。此数字是结果表中的总行数。因此,乍一看并没有多大意义。如前所述,只有将计算字段添加到 Power PivotTable 或 Power PivotChart 中才能看到计算字段的真正用途。
在 Power 数据透视表中使用计算字段
要使用计算字段来计算每个国家/地区的奖牌数量,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的数据透视表。
- 单击下拉列表中的数据透视表。
出现创建数据透视表对话框。
- 单击现有工作表。
- 选择要放置数据透视表的位置。
将创建一个空的数据透视表。
- 单击数据透视表字段列表中的结果表。
- 单击字段 – 国家和奖牌计数。
如您所见,奖牌计数被添加到 VALUES 区域,国家被添加到 ROWS 区域。数据透视表是使用出现在行中的字段 Country 值创建的。并且对于每一行,计算并显示奖牌计数值。就是这样,计算字段评估使用的 DAX 公式并显示值。
- 将“结果”表中的字段 Sport 添加到 ROWS 区域。
正如您在上面的屏幕截图中看到的,奖牌数是为每个国家/地区计算的 – 体育方面和国家本身的小计。
这就是 DAX 补充 Power 功能的方式。
计算字段的类型
有两种类型的计算字段 – 隐式和显式。
-
在 Power PivotTable Fields 列表窗格中创建了一个隐式计算字段。
-
一个明确的计算领域要么创建的表中电源透视窗口,或从PowerPivot的功能区在Excel窗口。
创建隐式计算字段
可以通过两种方式创建隐式计算字段,均在 Power PivotTable Fields 窗格中。
在数据透视表字段列表中创建隐式计算字段
您可以从数据透视表字段列表中的奖牌字段创建奖牌字段计数,如下所示 –
- 取消选择奖牌计数字段。
- 右键单击奖章字段。
- 单击下拉列表中的添加到值。
奖牌数出现在值区域中。奖牌数列将添加到数据透视表中。
在 VALUES 区域中创建隐式计算字段
您可以在值区域中创建一个隐式计算字段 – 父行的百分比,以将一个国家/地区赢得的每项运动的奖牌计数表示为该国家/地区赢得的奖牌总数的百分比。
- 单击 VALUES 区域的奖牌计数框中的向下箭头。
- 单击下拉列表中的值字段设置。
出现值字段设置对话框。
- 在自定义名称框中键入 % Medals。
- 单击将值显示为选项卡。
- 单击将值显示为下的框。
- 单击父行总计的百分比。
- 单击数字格式按钮。
出现格式化单元格对话框。
- 单击百分比。
- 在小数位中键入 0。
- 单击确定。
- 在“值字段设置”对话框中单击“确定”。
- 选择不显示小计。
您创建了另一个隐式计算字段 % Medals,您可以观察到,对于每个国家,都显示了运动奖牌的百分比。
隐式计算字段的缺点
隐式计算字段很容易创建。事实上,您甚至在 Excel 数据透视表和数据透视图中也一直在创建它们。但是,它们有以下缺点 –
-
它们是易变的。这意味着,如果您取消选择用于计算字段的字段,它将被删除。如果要再次显示它,则必须再次创建它。
-
它们的范围仅限于创建它们的数据透视表或数据透视图。如果在另一个工作表中创建另一个数据透视表,则必须再次创建计算字段。
另一方面,显式计算字段将与表一起保存,并且在您选择该表时可用。
创建显式计算字段
您可以通过两种方式创建显式计算字段 –
-
在数据模型中的表中的计算区域中。您已经在部分 – 在表中创建计算字段中学到了这一点。
-
来自 Excel 表中的 PowerPivot Ribbon。您将在下一节中学习这种创建显式计算字段的方法。
从 PowerPivot 功能区创建显式计算字段
要从 PowerPivot Ribbon 创建显式计算字段,请执行以下操作 –
- 单击工作簿中功能区上的 POWERPIVOT 选项卡。
- 单击计算区域中的计算字段。
- 单击下拉列表中的新计算字段。
出现计算字段对话框。
- 填写所需信息,如下面的屏幕截图所示。
- 单击检查公式按钮。
- 仅当公式中没有错误时才单击“确定”。
如您所见,您可以在此对话框中定义计算字段的类别和格式。此外,您可以使用 IntelliSense 功能了解函数的用法,并使用自动完成功能轻松完成函数、表和列的名称。有关 IntelliSense 功能的详细信息,请参阅“ DAX 公式”一章。
这是创建显式计算字段的推荐方法。
Excel DAX – 编辑计算字段
您可以编辑计算字段以对其进行修改。但是,在编辑计算字段之前,您应该知道它的存储位置。这意味着,计算字段存储在哪个表中。这适用于隐式和显式计算字段。一个计算字段只能与数据模型中的一个表相关联。
查找计算字段
要在数据模型中查找计算字段,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的高级选项卡。
- 单击显示隐式计算字段。
- 单击图表视图。
正如您在上面的屏幕截图中看到的那样,功能区上突出显示了“显示隐式计算字段”。如果它没有突出显示,请再次单击它。
您还可以观察到有 4 个复选框 – 列、计算字段、层次结构和 KPI。默认情况下,所有 4 个都被选中。
- 取消选中框 – 列、层次结构和 KPI。
这将只选中计算字段框。
如上面的屏幕截图所示,只有结果表显示了字段。另外两个表是空白的。这表明只有结果表具有计算字段。您还可以观察到隐式计算字段显示了一个图标,而显式计算字段 – Medal Count 没有该图标。
查看表中的计算字段
您可以查看表中的计算字段如下 –
- 单击计算字段。
- 右键单击并在下拉列表中选择转到。
该表将出现在数据视图中。
如上图所示,计算字段出现在表格的计算区域。
更改表中的计算字段
您可以更改用于表中计算字段的公式。
- 在数据模型的数据视图中单击表中的计算字段。
- 选择公式栏中的公式 – 在 := 的右侧。
该公式将突出显示。
- 键入新公式。
- 按 Enter。
您将在后续章节中了解有关 DAX 公式的更多信息。
重命名数据模型中的计算字段
您可以在数据视图或图表视图中更改数据表中计算字段的名称。
重命名数据视图中的计算字段
- 在数据模型的数据视图中单击表中的计算字段。
- 在公式栏中选择计算字段名称 – := 的左侧。
计算出的字段名称将突出显示。
- 为计算字段键入新名称。
- 按 Enter。
您将在后续章节中了解有关 DAX 语法的更多信息。
重命名图表视图中的计算字段
- 右键单击图表视图中表中的计算字段名称。
- 单击下拉列表中的重命名。
该名称将进入编辑模式。为计算字段键入新名称。
在 Excel 窗口中查看计算字段
您可以在 Excel 窗口中查看计算字段,如下所示 –
- 单击功能区上的 POWERPIVOT 选项卡。
- 单击计算组中的计算字段。
- 单击下拉列表中的管理计算字段。
出现管理计算字段对话框。数据模型中显式计算字段的名称出现在对话框中。
在管理计算字段中更改计算字段
您可以在“管理计算字段”对话框中更改计算字段。
- 单击奖牌计数。
- 单击编辑按钮。
出现计算字段对话框。
- 在公式框中选择 = 右侧的公式。
- 键入新公式。
- 单击确定。
- 单击“管理计算字段”对话框中的“关闭”。
在管理计算字段中重命名计算字段
您可以在“管理计算字段”对话框中重命名计算字段。
- 单击奖牌计数。
- 单击编辑按钮。
出现计算字段对话框。
- 在计算字段名称框中选择名称。
- 为计算字段键入新名称。
- 单击确定。
- 单击“管理计算字段”对话框中的“关闭”。
移动数据模型中的计算字段
您可以在创建它的表的计算区域内移动计算字段。但是,它不能移动到另一个表。
- 右键单击计算字段。
- 单击剪切。
- 将指针移动到同一个表的计算区域中的不同位置。
- 单击粘贴。
注意– 计算字段在表的计算区域内的位置并不重要,因为计算字段的 DAX 公式中的数据引用是按列名称并明确说明的。
Excel DAX – 删除计算字段
您可以删除显式和隐式计算字段。有几种方法可以做到这一点,您将在本章中学习。
但是,在删除计算字段之前,您需要记住以下几点 –
-
可以在多个数据透视表和/或数据透视图中使用显式计算字段。因此,您需要确保删除显式计算字段不会影响您已经生成的任何报告。
-
显式计算字段可用于其他显式计算字段的计算。因此,您需要确保显式计算字段未用于其他显式计算字段的任何计算。
-
隐式计算字段仅限于使用它的数据透视表或数据透视图。因此,在删除隐式计算字段之前,只需确保它可以从相应的数据透视表或数据透视图中删除即可。
-
创建隐式计算字段比创建显式计算字段更简单。因此,在删除显式计算字段之前需要更加谨慎。
-
如果名称与隐式计算字段的名称冲突,则不能创建显式计算字段。因此,您可能必须在创建显式计算字段之前删除该隐式计算字段。
删除数据模型中的显式计算字段
您可以在数据模型中的数据视图或图表视图中删除显式计算字段。
删除数据视图中的显式计算字段
- 在数据视图的计算区域中找到计算字段。
- 右键单击计算字段。
- 单击下拉列表中的删除。
出现删除确认信息。
单击从模型中删除。显式计算字段将被删除。
删除图表视图中的显式计算字段
- 在图表视图的数据表中找到计算字段。
- 右键单击计算的字段名称。
- 单击下拉列表中的删除。
出现删除确认信息。
单击从模型中删除。显式计算字段将被删除,并且不会在数据表的字段列表中看到。
删除 Excel 窗口中的显式计算字段
您可以从 Excel 窗口中删除显式计算字段,如下所示 –
- 单击功能区上的 POWERPIVOT 选项卡。
- 单击计算组中的计算字段。
- 单击下拉列表中的管理计算字段。
出现管理计算字段对话框。
- 单击显式计算字段名称。
- 单击删除按钮。
出现删除确认信息。
- 单击是。数据模型已更改的信息消息出现在顶部。
- 单击对话框中的关闭按钮。
显式计算字段将被删除,并且不会出现在工作簿的数据透视表/数据透视图字段列表中。
删除隐式计算字段
您可以在数据视图或数据模型的图表视图中删除隐式计算字段。
删除数据视图中的隐式计算字段
- 在数据视图的计算区域中找到计算字段。
- 右键单击计算字段。
- 单击下拉列表中的删除。
出现删除确认信息。
- 单击从模型中删除。隐式计算字段将被删除。
删除图表视图中的隐式计算字段
- 在图表视图的数据表中找到计算字段。
- 右键单击计算的字段名称。
- 单击下拉列表中的删除。
出现删除确认信息。
单击从模型中删除。隐式计算字段将被删除,并且不会在数据表的字段列表中看到。
Excel DAX – 语法
如前所述,DAX 是一种由运算符、值、函数和公式组成的公式语言。在本章中,您将了解 DAX 语法。
DAX 语法可以归类为 –
在继续学习 DAX 语法之前,您必须了解 Excel 公式和 DAX 公式之间的区别。
Excel 公式和 DAX 公式之间的差异
DAX 公式类似于 Excel 公式,您可以在公式栏中键入它们。但是,两者之间存在一些重要差异。
Excel Formula | DAX 公式 |
---|---|
Excel formulas are typed in the formula bar in the Excel window. |
DAX 公式在 Power Pivot 窗口的公式栏中键入。 |
In Excel formulas, you can reference individual cells or arrays for data. |
在 DAX 公式中,您只能引用完整的表或数据列,即只能引用表和表中的字段。 但是,如果您必须仅对部分列数据执行计算,则可以使用 DAX 函数来过滤并提供计算所需的唯一数据值。 |
Excel formulas support certain data types. |
DAX 提供的数据类型比 Excel 多。因此,DAX 公式也可以使用其他数据类型。 |
Excel does not support any implicit data conversions. |
DAX 在计算期间执行隐式数据类型转换。 |
Excel DAX – 运算符
DAX 是一种公式语言,由可用于公式或表达式的函数、运算符和值组成,用于计算和返回一个或多个值。
您可以使用DAX 运算符来比较值、执行算术计算和连接字符串。在本章中,您将了解 DAX 运算符以及如何使用它们。
DAX 运算符的类型
DAX 支持以下类型的运算符 –
DAX 运算符优先顺序
您可以拥有一个 DAX 公式,其中许多 DAX 运算符结合了多个值或表达式。在这种情况下,最终结果将取决于执行操作的顺序。DAX 为您提供默认运算符优先顺序以及覆盖默认优先顺序的方法。
下表列出了 DAX 默认运算符优先级。
Precedence Order | 操作员 | 手术 |
---|---|---|
1 | ^ | 求幂 |
2 | —— |
符号 |
3 | * 和 / | 乘法和除法 |
4 | ! | 不是 |
5 | + 和 – | 加减 |
6 | & | 级联 |
7 | =、<、>、<=、>= 和 <> | 等于、小于、大于、小于或等于、大于或等于和不等于 |
DAX 表达式语法
您需要首先了解 DAX 表达式语法以及如何使用操作数和运算符完成表达式计算。
-
所有表达式始终以等号 (=) 开头。等号表示后面的字符构成一个表达式。
-
在等号的右侧,您将拥有由 DAX 运算符连接的操作数。例如,= 5 + 4 > 5。
= 5 * 6 – 3。
-
表达式始终从左到右读取,并根据上一节中给出的 DAX 运算符优先级按该顺序完成计算。
-
如果 DAX 运算符具有相同的优先级值,则从左到右计算它们。例如,=5*6/10。* 和 / 具有相同的先例顺序。因此,表达式的计算结果为 30/10 = 3。
-
如果表达式中的 DAX 运算符具有不同的优先级值,则按从左到右的优先级顺序计算它们。
-
= 5 + 4 > 7。默认优先级是 + first 和 > next。因此,表达式是从左到右计算的。– 首先计算 5 + 4 得出 9,然后计算 9 > 5 得出 TRUE。
-
= 5 * 6 – 3。默认优先级是 * first 和 – next。因此,表达式是从左到右计算的。– 首先计算 5 * 6 得到 30,然后计算 30 – 3 得到 27。
-
= 2 * 5 – 6 * 3。默认优先级是 * first,* next 然后 -。因此,表达式的计算结果为 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 运算符 value2 时,两个操作数 value1 和 value2 应具有相同的数据类型。如果数据类型不同,DAX 会先将它们隐式转换为通用数据类型。有关详细信息,请参阅“DAX 语法”一章。
例如,您必须比较不同数据类型的两个操作数,比如一个由公式得出的数字,例如 =[Amount] * 0.08 和一个整数。第一个数字可以是一个有很多小数位的十进制数字,而第二个数字是一个整数。然后 DAX 处理它如下 –
-
首先,DAX 将使用可以存储两种数字的最大数字格式将两个操作数转换为实数。
-
接下来,DAX 将比较两个实数。
相比之下,Excel 会尝试比较不同数据类型的值,而无需先将它们强制转换为通用数据类型。因此,对于相同的比较表达式,您可能会在 DAX 和 Excel 中发现不同的结果。
数据类型的差异
DAX 和 Excel 中的运算符优先顺序相同。但是,DAX 不支持 Excel 支持的运算符百分比 (%) 和数据范围。此外,DAX 支持表作为数据类型,而 Excel 中并非如此。
此外,在 Excel 公式中,您可以引用单个单元格、数组或单元格区域。在 DAX 公式中,您不能引用其中任何一个。DAX 公式对数据的引用应按表、列、计算字段和计算列进行。
如果您从 Excel 复制公式并将其粘贴到 DAX 中,请确保 DAX 公式的正确性,因为 DAX 语法与 Excel 公式语法不同。另外,即使函数在 DAX 和 Excel 中具有相同的名称,其参数也可能不同,函数的结果也可能不同。
您将在后续章节中了解更多关于所有这些的信息。
Excel DAX – 标准参数
DAX 具有标准参数名称,以方便 DAX 函数的使用和理解。此外,您可以对参数名称使用某些前缀。如果前缀足够清楚,您可以使用前缀本身作为参数名称。
标准参数名称
以下是 DAX 标准参数名称 –
Sr.No. | 参数名称和说明 |
---|---|
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)。您可以省略参数名称 – 值,即重复三次并将其写为 DATE(年、月、日)。正如您所观察到的,通过仅使用前缀,该函数更具可读性。
但是,有时为了清楚起见,必须存在参数名称和前缀。
例如,考虑 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 中但不在 Excel 中的日期时间数据类型。
-
Excel 没有返回表的函数,但有些函数可以处理数组。许多 DAX 函数可以轻松引用完整的表和列来执行计算并返回一个表或一列值。DAX 的这种能力为使用 DAX 的 Power Pivot、Power View 和 Power BI 增添了力量。
-
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>] …)
-
平均值(<列>)
-
平均值(<列>)
-
AVERAGEX (<表>, <表达式>)
-
COUNT (<列>)
-
COUNTA (<列>)
-
COUNTAX (<表>, <表达式>)
-
COUNTBLANK(<列>)
-
COUNTROWS (<table>)
-
COUNTX (<表>, <表达式>)
-
交叉连接 (<table1>, <table2>, [<table3>] …)
-
DISTINCTCOUNT(<列>)
-
生成 (<table1>, <table2>)
-
GENERATEALL (<table1>, <table2>)
-
最大(<列>)
-
MAXA(<列>)
-
MAXX (<表>, <表达式>)
-
最小值(<列>)
-
米娜(<列>)
-
MINX (<表>, <表达式>)
-
产品(<列>)
-
PRODUCTX (<table>, <expression>)
-
ROW (<名称>, <表达式>, [<名称>, <表达式>] …)
-
SELECTCOLUMNS (<table>, <name>, <scalar_expression>,
-
[<名称>, <标量表达式>] …)
-
总和(<列>)
-
总结 (<table>, <groupBy_columnName>, [<groupBy_columnName>] …, [<name>, <expression>] …)
-
SUMX (<表>, <表达式>)
-
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>])
-
计算(<表达式>、<过滤器1>、<过滤器2>…)
-
CALCULATETABLE (<表达式>, <filter1>, <filter2>…)
-
CROSSFILTER (<columnName1>, <columnName2>, <direction>)
-
DISTINCT (<列>)
-
早期(<列>,<编号>)
-
最早(<列>)
-
过滤器(<表>,<过滤器>)
-
过滤器(<列名>)
-
HASONEFILTER(<列名>)
-
HASONEVALUE(<列名>)
-
ISCROSSFILTERED (<columnName>)
-
已过滤 (<columnName>)
-
KEEPFILTERS (<表达式>)
-
相关(<列>)
-
相关表(<表名>)
-
SUBSTITUTEWITHINDEX (<table>, <indexColumnName>, <indexColumnsTable>, <orderBy_expression>, [<order>], [<orderBy_expression>, [<order>]] …])
-
USERELATIONSHIP(<columnName1>,<columnName2>)
-
值(<表名或列名>)
DAX 时间智能函数
DAX 时间智能函数返回日期表或使用日期表来计算聚合。这些 DAX 函数使您能够使用时间段(包括天、月、季度和年)操作数据,从而帮助您创建支持商业智能分析需求的计算。
以下是一些 DAX 时间智能功能 –
-
CLOSINGBALANCEMONTH (<表达式>,<日期>[,<过滤器>])
-
CLOSINGBALANCEQUARTER(<表达式>、<日期>、[<过滤器>])
-
CLOSINGBALANCEYEAR (<表达式>,<日期>, [<过滤器>], [<年终日期>])
-
DATEADD (<日期>,<number_of_intervals>, <interval>)
-
DATESBETWEEN (<dates>,<start_date>,<end_date>)
-
DATESINPERIOD (<dates>,<start_date>, <number_of_intervals>,<interval>)
-
DATESMTD(<日期>)
-
DATESQTD (<日期>)
-
DATESYTD (<dates>, [<year_end_date>])
-
ENDOFMONTH(<日期>)
-
ENDOFQUARTER(<日期>)
-
ENDOFYEAR (<dates> , [<year_end_date>])
-
第一天(<日期>)
-
FIRSTNONBLANK (<列>,<表达式>)
-
上次日期(<日期>)
-
LASTNONBLANK (<列>,<表达式>)
-
次日(<日期>)
-
下个月(<日期>)
-
下一季度(<日期>)
-
NEXTYEAR (<dates>, [<year_end_date>])
-
OPENINGBALANCEMONTH (<表达式>,<日期>, [<过滤器>])
-
OPENINGBALANCEQUARTER(<表达式>、<日期>、[<过滤器>])
-
OPENINGBALANCEYEAR(<表达式>、<日期>、[<过滤器>]、[<年终日期>])
-
PARALLELPERIOD (<dates>,<number_of_intervals>, <interval>)
-
前一天(<日期>)
-
上个月(<日期>)
-
上一季度(<日期>)
-
上一年 (<dates>, [<year_end_date>])
-
SAMEPERIODLASTYEAR(<日期>)
-
STARTOFMONTH(<日期>)
-
STARTOFQUARTER(<日期>)
-
STARTOFYEAR(<日期>)
-
TOTALMTD (<表达式>,<日期>, [<过滤器>])
-
TOTALQTD(<表达式>,<日期>, [<过滤器>])
-
TOTALYTD(<表达式>,<日期>, [<过滤器>], [<year_end_date>])
DAX 日期和时间函数
DAX 日期和时间函数类似于 Excel 日期和时间函数。但是,DAX 日期和时间函数基于 DAX 的日期时间数据类型。
以下是 DAX 日期和时间函数 –
- 日期(<年>,<月>,<日>)
- 日期值(日期文本)
- DAY(<日期>)
- EDATE(<开始日期>, <月>)
- EOMONTH(<开始日期>, <月>)
- 小时(<日期时间>)
- 分钟(<日期时间>)
- MONTH(<日期时间>)
- 现在()
- 第二(<时间>)
- TIME(时、分、秒)
- 时间值(时间文本)
- 今天()
- WEEKDAY(<日期>, <返回类型>)
- WEEKNUM(<日期>, <返回类型>)
- 年(<日期>)
- YEARFRAC(<开始日期>, <结束日期>, <基础>)
DAX 信息函数
DAX 信息函数查看作为参数提供的单元格或行,并告诉您该值是否与预期类型匹配。
以下是一些 DAX 信息功能 –
-
包含 (<table>, <columnName>, <value>, [<columnName>, <value>]…)
-
自定义数据()
-
ISBLANK(<值>)
-
ISERROR(<值>)
-
ISEVEN(数)
-
ISLOGICAL(<值>)
-
ISNONTEXT(<值>)
-
ISNUMBER(<值>)
-
ISONORAFTER (<scalar_expression>, <scalar_expression>, [sort_order], [<scalar_expression>, <scalar_expression>, [sort_order]]…)
-
ISTEXT(<值>)
-
LOOKUPVALUE(<result_columnName>、<search_columnName>、<search_value>、[<search_columnName>、<search_value>]…)
-
用户名()
DAX 逻辑函数
DAX 逻辑函数返回有关表达式中值的信息。例如,DAX TRUE 函数让您知道您正在评估的表达式是否返回 TRUE 值。
以下是 DAX 逻辑函数 –
- AND(<逻辑 1>,<逻辑 2>)
- 错误的()
- IF(logical_test>,<value_if_true>, value_if_false)
- IFERROR(value, value_if_error)
- 非(<逻辑>)
- 或(<逻辑1>,<逻辑2>)
- SWITCH(<表达式>, <值>, <结果>, [<值>, <结果>]…, [<else>])
- 真的()
DAX 数学和三角函数
DAX 数学和三角函数与 Excel 数学和三角函数非常相似。
以下是一些 DAX 数学和三角函数 –
- ABS(<编号>)
- ACOS(数量)
- ACOSH(人数)
- ASIN(数量)
- ASINH(数量)
- ATAN(数量)
- ATANH(数量)
- 天花板(<数字>,<重要性>)
- 组合(号码,号码_选择)
- 组合(号码,号码_选择)
- COS(数)
- COSH(人数)
- 货币(<值>)
- DEGREES(角度)
- DIVIDE(<分子>, <分母>, [<alternateresult>])
- 偶数(数字)
- 经验(<数量>)
- 事实(<数字>)
- 楼层(<数字>,<意义>)
- GCD(number1, [number2], …)
- INT(<数字>)
- ISO.CEILING(<number>, [<significance>])
- LCM(number1, [number2], …)
- LN(<编号>)
- LOG(<数字>,<基数>)
- LOG10(<编号>)
- INT(<数字>)
- MROUND(<number>, <multiple>)
- 奇数)
- PI()
- 功率(<数字>, <功率>)
- 产品(<列>)
- PRODUCTX(<表>, <表达式>)
- QUOTIENT(<分子>, <分母>)
- 弧度(角度)
- 兰德()
- 随机(<底部>,<顶部>)
- ROUND(<number>, <num_digits>)
- ROUNDDOWN(<number>, <num_digits>)
- ROUNDUP(<number>, <num_digits>)
- SIN(号码)
- SINH(号码)
- 签名(<数字>)
- SQRT(<编号>)
- SUM(<列>)
- SUMX(<表>, <表达式>)
- 谭(号码)
- TANH(数量)
- TRUNC(<number>,<num_digits>)
DAX 其他功能
这些 DAX 函数执行独特的操作,大多数其他函数所属的任何类别都无法定义这些操作。
以下是一些 DAX 其他功能 –
-
EXCEPT(<table_expression1>, <table_expression2>
-
GROUPBY (<table>, [<groupBy_columnName1>], [<name>, <expression>] … )
-
INTERSECT(<table_expression1>, <table_expression2>)
-
ISEMPTY(<table_expression>)
-
NATURALINNERJOIN(<leftJoinTable>, <rightJoinTable>)
-
NATURALLEFTOUTERJOIN(<leftJoinTable>, <rightJoinTable>)
-
SUMMARIZECOLUMNS (<groupBy_columnName>, [<groupBy_columnName>]…, [<filterTable>] …, [<name>, <expression>]…)
-
UNION (<table_expression1>, <table_expression2>, [<table_expression>]…)
-
VAR <名称> = <表达式>
DAX 父子函数
DAX 父子函数可用于管理在数据模型中显示为父/子层次结构的数据。
以下是一些 DAX 父子函数 –
- PATH(<ID_columnName>, <parent_columnName>)
- PATHCONTAINS(<路径>, <项目>)
- PATHITEM(<路径>, <位置>, [<类型>])
- PATHITEMREVERSE(<路径>, <位置>, [<类型>])
- 路径长度(<路径>)
DAX 统计函数
DAX 统计函数与 Excel 统计函数非常相似。
以下是一些 DAX 统计函数 –
-
BETA.DIST(x, alpha, beta, 累积,[A],[B])
-
BETA.INV(概率, alpha, beta,[A],[B])
-
CHISQ.INV(概率,deg_freedom)
-
CHISQ.INV.RT(概率,deg_freedom)
-
信心.规范(alpha,standard_dev,大小)
-
信心.T(alpha,standard_dev,大小)
-
数据表 (ColumnName1, DataType1, ColumnName2, DataType2 …, {{Value1, Value2…}, {ValueN, ValueN+1…}…})
-
EXPON.DIST(x, lambda, 累积)
-
GEOMEAN(<列>)
-
GEOMEANX(<表>, <表达式>)
-
中位数(<列>)
-
MEDIANX(<表>, <表达式>)
-
PERCENTILE.EXC(<列>, <k>)
-
PERCENTILE.INC(<列>, <k>)
-
PERCENTILEX.EXC(<表>, <表达式>, k)
-
PERCENTILEX.EXC(<表>, <表达式>, k)
-
POISSON.DIST(x,平均值,累积)
-
RANK.EQ(<value>, <columnName>[, <order>])
-
RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])
-
SAMPLE (<n_value>, <table>, <orderBy_expression>, [<order>], [<orderBy_expression>, [<order>]]…)
-
STDEV.P(<列名>)
-
STDEV.S(<列名>)
-
STDEVX.P(<表>, <表达式>)
-
STDEVX.S(<表>, <表达式>)
-
SQRTPI(数量)
-
VAR.P(<列名>)
-
VAR.S(<列名>)
-
VARX.P(<表>, <表达式>)
-
VARX.S(<表>, <表达式>)
-
XIRR(<table>, <values>, <dates>, [guess])
-
XNPV(<table>, <values>, <dates>, <rate>)
DAX 文本函数
DAX 文本函数适用于表和列。使用 DAX 文本函数,您可以返回字符串的一部分、搜索字符串中的文本或连接字符串值。您还可以控制日期、时间和数字的格式。
以下是一些 DAX 文本函数 –
- 空白的()
- 代码(文本)
- 连接(<文本1>,<文本2>)
- CONCATATEX(<table>, <expression>, [delimiter])
- 精确(<文本1>,<文本2>)
- FIND(<find_text>, <within_text>, [<start_num>], [<NotFoundValue>])
- 固定(<数字>,<小数>,<无逗号>)
- 格式(<值>,<格式字符串>)
- 左(<文本>,<num_chars>)
- LEN(<文本>)
- 降低(<文本>)
- MID(<text>, <start_num>, <num_chars>)
- REPLACE(<old_text>, <start_num>, <num_chars>, <new_text>)
- REPT(<text>, <num_times>)
- 右(<文本>,<num_chars>)
- 搜索(<find_text>, <within_text>, [<start_num>], [<NotFoundValue>])
- 替换(<文本>,<旧文本>,<新文本>,<实例编号>)
- 修剪(<文本>)
- 上 (<文本>)
- 值(<文本>)
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 函数 Early () 存储来自当前操作之前的操作的行上下文。此函数在内存中存储两组上下文 – 一组上下文表示公式内部循环的当前行,另一组上下文表示公式外部循环的当前行。DAX 会自动在两个循环之间提供值,以便您可以创建复杂的聚合。
有关示例,请参阅方案 – 排名和比较值一章中的方案 – 创建动态排名值的 DAX 公式。
过滤上下文
过滤器上下文是指应用于 DAX 中的数据模型的任何过滤。筛选上下文由数据透视表和 DAX 函数创建。
筛选由数据透视表创建的上下文
由数据透视表创建的过滤器上下文是通过对以下数据透视表字段所做的选择应用的自然过滤 –
- 行
- 列
- 过滤器
- 切片机
由数据透视表创建的筛选上下文筛选数据模型中的基础表。如果表相关,则过滤器从查找表向下流向数据表。这意味着,您可以根据查找表的结果过滤数据表。过滤器传播不会以相反的方式发生。但是,您可以使用 DAX 公式根据数据表的结果过滤查找表。
过滤由 DAX 函数创建的上下文
您可以使用 DAX 过滤器函数来定义计算字段和计算列,其中包含控制 DAX 公式使用的值的过滤器表达式。这些计算字段和计算列然后成为数据透视表字段列表的一部分,您可以将它们添加到数据透视表。您还可以使用这些 DAX 过滤器功能有选择地清除特定列上的过滤器。CALCULATE() 是创建过滤器上下文的强大 DAX 过滤器函数的一个示例。有关示例,请参阅场景 – 执行复杂计算一章。
过滤上下文作为行上下文的补充
行上下文不会自动创建过滤器上下文。您可以使用包含 DAX 过滤器函数的 DAX 公式实现相同的效果。
Excel DAX – 公式
DAX 是一种用于在 Power 数据透视表中创建自定义计算的公式语言。您可以使用旨在处理关系数据并在 DAX 公式中执行动态聚合的 DAX 函数。
DAX 公式与 Excel 公式非常相似。要创建 DAX 公式,请键入等号,后跟函数名称或表达式以及任何必需的值或参数。
DAX 函数与 DAX 公式
DAX 公式可以包含 DAX 函数并利用它们的用法。这就是 DAX 公式在重要方面与 DAX 函数不同的地方。
-
DAX 函数始终引用完整的列或表。如果您只想使用表或列中的特定值,您可以向公式添加过滤器。
-
如果要逐行自定义计算,Power Pivot 提供的函数可让您使用当前行值或相关值来执行因上下文而异的计算。
-
DAX 包含一种函数,它返回一个表作为结果,而不是一个单一的值。这些函数可用于为其他函数提供输入,从而计算整个表或列的值。
-
某些 DAX 函数提供时间智能,可让您使用有意义的日期范围创建计算,并比较并行期间的结果。
了解 DAX 公式语法
每个 DAX 公式都具有以下语法 –
-
每个公式必须以等号开头。
-
在等号的右侧,您可以键入或选择函数名称,或者键入表达式。该表达式可以包含由 DAX 运算符连接的表名和列名。
以下是一些有效的 DAX 公式 –
- [column_Cost] + [column_Tax]
- = 今天 ()
了解 IntelliSense 功能
DAX 提供了 IntelliSense 功能,可让您快速正确地编写 DAX 公式。使用此功能,您无需完全键入表、列和函数名称,而是在编写 DAX 公式时从下拉列表中选择相关名称。
-
开始键入函数名称的前几个字母。AutoComplete 显示可用函数的列表,名称以这些字母开头。
-
将指针放在任何函数名称上。将显示 IntelliSense 工具提示,让您可以使用该功能。
-
单击函数名称。函数名称出现在公式栏中并显示语法,它将指导您选择参数。
-
键入所需的表名的第一个字母。AutoComplete 显示名称以该字母开头的可用表和列的列表。
-
按 TAB 键或单击名称将自动完成列表中的项目添加到公式中。
-
单击Fx按钮以显示可用功能列表。要从下拉列表中选择一个函数,请使用箭头键突出显示该项目,然后单击确定将该函数添加到公式中。
-
通过从可能的表和列的下拉列表中选择参数或键入所需的值,为函数提供参数。
强烈建议使用这种方便的 IntelliSense 功能。
在哪里使用 DAX 公式?
您可以在创建计算列和计算字段时使用 DAX 公式。
-
您可以在计算列中使用 DAX 公式,方法是添加一列,然后在公式栏中键入表达式。您可以在 PowerPivot 窗口中创建这些公式。
-
您可以在计算字段中使用 DAX 公式。您创建这些公式 –
-
在“计算字段”对话框的 Excel 窗口中,或
-
在表格计算区域的 Power Pivot 窗口中。
-
同一公式的行为可能有所不同,具体取决于公式是在计算列中还是在计算字段中使用。
-
在计算列中,公式始终应用于列中的每一行,贯穿整个表。根据行上下文,该值可能会更改。
-
然而,在计算领域,结果的计算强烈依赖于上下文。也就是说,数据透视表的设计以及行和列标题的选择会影响计算中使用的值。
理解 DAX 中上下文的概念对于编写 DAX 公式很重要。这在您的 DAX 之旅开始时可能有点困难,但是一旦您掌握了它,您就可以编写复杂和动态数据分析所需的有效 DAX 公式。有关详细信息,请参阅“DAX 上下文”一章。
创建 DAX 公式
您已经在上一节中了解了 IntelliSense 功能。请记住在创建任何 DAX 公式时使用它。
要创建 DAX 公式,请使用以下步骤 –
-
键入等号。
-
在等号的右侧,键入以下内容 –
-
键入函数或表名称的第一个字母,然后从下拉列表中选择完整名称。
-
如果您选择了函数名称,请键入括号“(”。
-
如果您选择了表名,请输入方括号“[”。键入列名称的第一个字母并从下拉列表中选择完整名称。
-
用’]’关闭列名,用’)’关闭函数名。
-
在表达式之间键入 DAX 运算符或键入“,”以分隔函数参数。
-
重复步骤 1 – 5,直到完成 DAX 公式。
-
例如,您要查找东部地区的总销售额。您可以编写如下所示的 DAX 公式。East_Sales 是表的名称。金额是表中的一列。
SUM ([East_Sales[Amount])
正如在 DAX 语法一章中已经讨论过的,建议在每次引用任何列名时使用表名和列名。这被称为 – “完全限定名称”。
DAX 公式可以根据它是用于计算字段还是计算列而有所不同。有关详细信息,请参阅以下部分。
为计算列创建 DAX 公式
您可以在 Power Pivot 窗口中为计算列创建 DAX 公式。
- 单击要在其中添加计算列的表的选项卡。
- 单击功能区上的设计选项卡。
- 单击添加。
- 在公式栏中键入计算列的 DAX 公式。
= DIVIDE (East_Sales[Amount], East_Sales[Units])
此 DAX 公式对 East_Sales 表中的每一行执行以下操作 –
-
将行的金额列中的值除以同一行中单位列中的值。
-
将结果放在同一行中新添加的列中。
-
迭代地重复步骤 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 窗口公式栏的公式栏。公式栏使创建和编辑公式变得更加容易,使用自动完成功能以最大程度地减少语法错误。
-
要输入表格名称,请开始键入表格名称。公式自动完成提供了一个下拉列表,其中包含以这些字母开头的有效表名。如果需要,您可以从一个字母开始,然后键入更多字母以缩小列表的范围。
-
要输入列名,您可以从所选表的列名列表中选择它。在表名右侧键入方括号“[”,然后从所选表的列列表中选择该列。
使用自动完成的提示
以下是使用 AutoComplete 的一些提示 –
-
您可以在 DAX 公式中嵌套函数和公式。在这种情况下,您可以在具有嵌套函数的现有公式中间使用公式自动完成。插入点之前的文本用于显示下拉列表中的值,插入点之后的所有文本保持不变。
-
您为常量创建的定义名称不会显示在 AutoComplete 下拉列表中,但您仍然可以键入它们。
-
函数的右括号不会自动添加。你需要自己做。
-
您必须确保每个函数在语法上都是正确的。
了解插入功能特征
您可以在 Power Pivot 窗口和 Excel 窗口中找到标记为fx的“插入函数”按钮。
-
Power Pivot 窗口中的“插入功能”按钮位于公式栏的左侧。
-
Excel 窗口中的“插入函数”按钮位于“公式”右侧的“计算字段”对话框中。
当您单击fx按钮时,会出现插入函数对话框。“插入函数”对话框是查找与 DAX 公式相关的 DAX 函数的最简单方法。
“插入函数”对话框可帮助您按类别选择函数并提供每个函数的简短说明。
在 DAX 公式中使用插入函数
假设您要创建以下计算字段 –
Medal Count: = COUNTA (]Medal])
您可以使用以下步骤使用插入函数对话框 –
- 单击结果表的计算区域。
- 在公式栏中键入以下内容 –
Medal Count: =
- 单击插入函数按钮 ( fx )。
出现插入函数对话框。
-
在“选择类别”框中选择“统计”,如下面的屏幕截图所示。
-
在 Select a function 框中选择 COUNTA,如下面的屏幕截图所示。
如您所见,将显示选定的 DAX 函数语法和函数描述。这使您能够确保它是您要插入的函数。
-
单击确定。Medal Count:=COUNTA( 出现在公式栏中,并且还会出现显示函数语法的工具提示。
-
类型 [。这意味着您将要键入列名。当前表中所有列和计算字段的名称将显示在下拉列表中。您可以使用 IntelliSense 来完成公式。
-
键入 M。下拉列表中显示的名称将仅限于以“M”开头的名称。
-
点击勋章。
-
双击勋章。Medal Count: = COUNTA([Medal] 将显示在公式栏中。关闭括号。
-
按 Enter。你完成了。您也可以使用相同的过程来创建计算列。您还可以按照相同的步骤使用插入函数功能在 Excel 窗口的计算字段对话框中插入函数。
-
单击公式右侧的插入函数 ( fx ) 按钮。
出现插入函数对话框。其余步骤与上述相同。
在 DAX 公式中使用多个函数
DAX 公式最多可以包含 64 个嵌套函数。但是,DAX 公式不太可能包含如此多的嵌套函数。
如果 DAX 公式具有许多嵌套函数,则它具有以下缺点 –
- 该公式将很难创建。
- 如果公式有错误,将很难调试。
- 公式评估不会很快。
在这种情况下,您可以将公式拆分为较小的可管理公式并逐步构建大公式。
使用标准聚合创建 DAX 公式
执行数据分析时,您将对聚合数据执行计算。您可以在 DAX 公式中使用多种 DAX 聚合函数,例如 SUM、COUNT、MIN、MAX、DISTINCTCOUNT 等。
您可以使用 Power Pivot 窗口中的 AutoSum 功能使用标准聚合自动创建公式。
- 单击 Power Pivot 窗口中的结果选项卡。将显示结果表。
- 单击奖牌列。将选择整个列 – 奖牌。
- 单击功能区上的“主页”选项卡。
- 单击计算组中 AutoSum 旁边的向下箭头。
- 单击下拉列表中的 COUNT。
如您所见,计算的字段Count of Medal 出现在列- Medal 下方的计算区域中。DAX 公式也出现在公式栏中 –
Count of Medal: = COUNTA([Medal])
AutoSum 功能已经为您完成了工作 – 创建了用于数据聚合的计算字段。此外,AutoSum 采用了 DAX 函数 COUNT 的适当变体,即 COUNTA(DAX 具有 COUNT、COUNTA、COUNTAX 函数)。
注意事项 – 要使用 AutoSum 功能,您需要单击功能区上 AutoSum 旁边的向下箭头。如果您点击 AutoSum 本身,您将获得 –
Sum of Medal: = SUM([Medal])
错误被标记为 Medal 不是数字数据列,并且该列中的文本无法转换为数字。
有关 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 窗口中功能区上的主页选项卡。
- 单击刷新。
- 单击下拉列表中的刷新以刷新所选表。
- 单击下拉列表中的全部刷新以刷新所有表。
要刷新数据模型中使用相同连接的所有表的数据,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的主页选项卡。
- 单击获取外部数据组中的现有连接。
出现现有连接对话框。
- 选择一个连接。
- 单击刷新按钮。
当 PowerPivot 引擎从选定表或数据源的所有表重新加载数据时,将出现数据刷新对话框并显示数据刷新进度信息。
有三种可能的结果 –
-
成功– 报告导入每个表的行数。
-
错误– 如果数据库处于脱机状态,则可能会发生错误,您不再拥有权限。在源中删除或重命名表或列。
-
已取消– 这意味着 Excel 没有发出刷新请求,可能是因为连接上禁用了刷新。
单击关闭按钮。
更改数据源
要更改数据模型中的数据,您可以在 Power Pivot 窗口中编辑连接信息或更新数据模型中使用的表和列的定义。
您可以对现有数据源进行以下更改 –
连接
- 编辑数据库名称或服务器名称。
- 更改源文本文件、电子表格或数据馈送的名称。
- 更改数据源的位置。
- 对于关系数据源,更改默认目录或初始目录。
- 更改用于访问数据的身份验证方法或凭据。
- 编辑数据源的高级属性。
表
- 添加或删除数据过滤器。
- 更改过滤条件。
- 添加或删除表。
- 更改表名。
- 编辑数据源中的表与数据模型中的表之间的映射。
- 从数据源中选择不同的列。
列
- 更改列名称。
- 添加新列。
- 从数据模型中删除列(不影响数据源)。
您可以通过以下方式编辑现有数据源的属性 –
-
您可以更改连接信息,包括用作源的文件、提要或数据库、其属性或其他提供者特定的连接选项。
-
您可以更改表和列映射并删除对不再使用的列的引用。
-
您可以更改从外部数据源获取的表、视图或列。
修改与现有数据源的连接
您可以通过更改当前连接使用的外部数据源来修改已创建的与外部数据源的连接。但是,要遵循的过程取决于数据源类型。
- 单击 PowerPivot 窗口中功能区上的主页选项卡。
- 单击获取外部数据组中的现有连接。
出现现有连接对话框。选择要修改的连接。
根据您要更改的数据源的类型,提供程序可能会有所不同。此外,可用的属性可能需要更改。考虑一个连接到包含数据的 Excel 工作簿的简单示例。
-
单击编辑按钮。出现编辑连接对话框。
-
单击“浏览”按钮以定位另一个相同类型的数据库(本例中为 Excel 工作簿),但名称或位置不同。
-
单击打开按钮。
新文件将被选中。将出现一条消息,指出您已修改连接信息,您需要保存和刷新表以验证连接。
-
单击保存按钮。您将返回现有连接对话框。
-
单击刷新按钮。出现数据刷新对话框,显示数据刷新进度。将显示数据刷新的状态。有关详细信息,请参阅“手动刷新现有数据源”部分。
-
数据刷新成功后点击关闭。
-
单击“现有连接”对话框中的“关闭”。
编辑表和列映射(绑定)
要在数据源更改时编辑列映射,请执行以下操作 –
-
在 Power Pivot 窗口中单击包含要修改的表的选项卡。
-
单击功能区上的设计选项卡。
-
单击表属性。
出现编辑表属性对话框。
您可以观察以下内容 –
-
数据模型中所选表的名称显示在表名称框中。
-
外部数据源中对应表的名称显示在“源名称”框中。
-
列名有两个选项 – Source 和 Modal。
-
如果列在数据源和数据模型中的命名不同,您可以通过选择这些选项在两组列名称之间切换。
-
所选表格的预览出现在对话框中。
您可以编辑以下内容 –
-
要更改用作数据源的表,请选择与源名称下拉列表中所选表不同的表。
-
如果需要,更改列映射 –
-
要添加存在于源中但不在数据模型中的列,请选中列名称旁边的复选框。对要添加的所有列重复此操作。下次刷新时,实际数据将加载到数据模型中。
-
如果数据模型中的某些列在当前数据源中不再可用,则通知区域中会显示一条消息,其中列出了无效列。你不需要做任何事情。
-
-
单击保存按钮。
当您保存当前的表属性集时,您将收到一条消息 – 请稍候。然后将显示检索到的行数。
在数据模型的表中,任何无效的列都会被自动删除并添加新的列。
更改列名和数据类型
您可以更改数据模型中表中列的名称,如下所示 –
-
双击列的标题。标题中列的名称将突出显示。
-
键入新列名,覆盖旧名。或者,您可以更改数据模型中表中列的名称,如下所示:
-
通过单击其标题选择该列。
-
右键单击该列。
-
单击下拉列表中的重命名列。
标题中列的名称将突出显示。键入新列名,覆盖旧名。
正如您所了解的,数据模型中表中一列中的所有值都必须具有相同的数据类型。
要更改列的数据类型,请执行以下操作 –
-
通过单击标题选择要更改的列。
-
单击功能区上的“主页”选项卡。
-
单击格式组中的控件可修改列的数据类型和格式。
向数据源添加/更改过滤器
您可以在导入数据时向数据源添加过滤器,以限制数据模型中表中的行数。稍后,您可以通过更改您之前定义的过滤器在数据模型中的表中添加更多行或减少行数。
在导入期间向数据源添加过滤器
要在数据导入期间向数据源添加新过滤器,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的主页选项卡。
- 单击获取外部数据组中的数据源之一。
出现表导入向导对话框。
- 继续步骤 – 选择表和视图。
- 选择一个表,然后单击预览和过滤器。
出现预览选定表对话框。
- 单击要应用过滤器的列。
- 单击列标题右侧的向下箭头。
要添加过滤器,请执行以下操作之一 –
-
在列值列表中,选择或清除一个或多个作为筛选依据的值,然后单击确定。
但是,如果值的数量非常多,则列表中可能不会显示单个项目。相反,您会看到消息 – “要显示的项目太多。”
-
单击数字过滤器或文本过滤器(取决于列的数据类型)。
-
然后,单击比较运算符命令之一(例如 Equals),或单击自定义过滤器。在“自定义过滤器”对话框中,创建过滤器,然后单击“确定”。
-
注意– 如果您在任何阶段犯了错误,请单击清除行过滤器按钮并重新开始。
- 单击确定。您将返回到表导入向导的选择表和视图页面。
如您所见,在列 – 过滤器详细信息中,您定义过滤器的列会出现一个已应用过滤器链接。
您可以单击该链接以查看由向导构建的过滤器表达式。但是,每个过滤器表达式的语法取决于提供程序,您无法对其进行编辑。
- 单击完成以导入应用了过滤器的数据。
- 关闭表导入向导。
将过滤器更改为现有数据源
导入数据后,您可能需要不时更新数据,方法是添加更多行或限制表中的现有行。在这种情况下,您可以更改表上的现有过滤器或添加新过滤器。
-
单击 Power Pivot 窗口中功能区上的主页选项卡。
-
单击获取外部数据组中的现有连接。出现现有连接对话框。
-
单击包含您必须更改过滤器的表的连接。
-
单击打开按钮。
您将进入表导入向导对话框。重复上一节中的步骤以过滤列。
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 公式之前更改 DAX 公式中使用的列和表的名称。
-
您知道工作簿中的某些数据已更改,但您正在使用未更改的其他列,因此您想推迟重新计算。
-
您正在一个具有许多依赖项的工作簿中工作,并希望推迟重新计算,直到您确定已进行所有必要的更改。
但是,您应该知道,只要将工作簿配置为手动重新计算模式,就不会执行任何公式验证或检查。这将导致以下结果 –
-
您添加到工作簿的任何新公式都将被标记为包含错误。
-
新的计算列中不会出现任何结果。
为手动重新计算配置工作簿
正如您所了解的,自动重新计算是任何工作簿的数据模型中的默认模式。要为手动重新计算配置工作簿,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的设计选项卡。
- 单击计算组中的计算选项。
- 单击下拉列表中的手动计算模式。
手动重新计算 DAX 公式
要手动重新计算 DAX 公式,请执行以下操作 –
- 单击 Power Pivot 窗口中功能区上的设计选项卡。
- 单击计算组中的计算选项字段。
- 单击下拉列表中的立即计算字段。
DAX 公式重新计算疑难解答
每当工作簿的数据模型发生更改时,Power Pivot 都会对现有数据进行分析,以确定是否需要重新计算并以尽可能最有效的方式执行更新。
在重新计算 DAX 公式期间,Power Pivot 处理以下内容 –
- 依赖关系
- 依赖列的重新计算顺序
- 交易
- 可变函数的重新计算
依赖关系
当一列依赖于另一列,并且该另一列的内容以任何方式发生变化时,可能需要重新计算所有相关列。
Power Pivot 始终对表执行完整的重新计算,因为完整的重新计算比检查更改的值更有效。触发重新计算的更改可能包括删除列、更改列的数字数据类型或添加新列。这些变化被视为重大变化。但是,看似微不足道的更改,例如更改列的名称,也可能会触发重新计算。这是因为列的名称在 DAX 公式中用作标识符。
在某些情况下,Power Pivot 可能会确定可以从重新计算中排除列。
相关列的重新计算顺序
在任何重新计算之前计算相关性。如果存在多个相互依赖的列,Power Pivot 将遵循依赖关系的顺序。这可确保以最大速度按正确顺序处理列。
交易
重新计算或刷新数据的操作作为事务发生。这意味着如果刷新操作的任何部分失败,其余操作将回滚。这是为了确保数据不会处于部分处理状态。但是,您无法像在关系数据库中那样管理事务或创建检查点。
波动函数的重新计算
NOW、RAND 或 TODAY 等 DAX 函数没有固定值,被称为易失性函数。如果在计算列中使用此类 DAX 函数,则执行查询或过滤通常不会导致重新评估它们以避免性能问题。
仅当重新计算整个列时,才会重新计算这些 DAX 函数的结果。这些情况包括从外部数据源刷新或手动编辑数据,导致重新评估包含这些函数的 DAX 公式。
但是,如果在计算字段的定义中使用这些函数,则将始终重新计算这些函数。
Excel DAX – 公式错误
使用错误的语法编写DAX 公式时可能会出错。计算字段和计算列可以包含需要特定类型参数的 DAX 函数。DAX 函数的参数可以是表、列或其他 DAX 函数(嵌套 DAX 函数)。由于 DAX 函数可以返回表和列,因此应注意检查传递给 DAX 函数的参数类型是否正确。
DAX 公式错误可以是语法错误或语义错误。错误可能发生在设计时或运行时。
在本章中,您将了解一些常见的 DAX 错误、它们的原因以及如何修复这些错误。
DAX 错误:计算中止
尝试使用 DAX 时间智能函数创建(设计时)或使用(运行时)计算字段时,可能会发生以下错误。在每种情况下,都会将不连续的日期范围传递给时间智能函数。
“DAX 错误:计算中止:MdxScript(实例)(00, 0)函数‘DATEADD’仅适用于连续的日期选择。”
运行时的原因
如果将具有 DAX 时间智能函数的计算字段放置在数据透视表的 VALUES 区域中,并且在选择年份之前选择月份或季度等日期字段作为切片器或过滤器,则会显示此错误。例如,如果您有三年(2014 年、2015 年和 2016 年)的数据,并且您尝试仅使用三月而不选择年字段,则这些值不是连续的数据值,您将收到错误消息。
如何在运行时修复错误?
在上面的例子中,
-
首先添加年份作为切片器或过滤器,然后选择一年。
-
然后,添加 Month 或 Quarter 作为切片器或过滤器。
-
然后,选择一个或多个月份或季度以对所选年份进行切片或筛选。
设计时的原因
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 函数 –
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 函数
此类别中的 DAX 函数返回日期表。这些函数将主要用作 DAX 函数 CALCULATE 的 SetFilter 参数。
此类别中有 16 个 DAX 函数。这些 DAX 函数中的八 (8) 个是“上一个”和“下一个”函数。
-
“上一个”和“下一个”函数以当前上下文中的日期列开始,并计算前一天或后一天、一个月、一个季度或一年。
-
“上一个”函数从当前上下文中的第一个日期开始向后工作,“下一个”函数从当前上下文中的最后一个日期向前移动。
-
“上一个”和“下一个”函数以单列表的形式返回结果日期。
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 中的日期向后移动一年的日期列。 注意– SAMEPERIODLASTYEAR 要求当前上下文包含一组连续的日期。 如果当前上下文不是一组连续的日期,则 SAMEPERIODLASTYEAR 将返回错误。 |
-
四 (4) 个 DAX 函数用于从当前上下文中的一组日期转换为一组新的日期。
这些 DAX 功能比以前的功能更强大。
-
DAX 函数 – DATEADD、DATESINPERIOD 和 PARALLELPERIOD 从当前上下文中移动一定数量的时间间隔。间隔可以是日、月、季或年,分别由关键字 DAY、MONTH、QUARTER 和 YEAR 表示。
例如:
-
-
向后移动 2 天。
-
提前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 开始并继续指定 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 函数可用于评估指定时间段内的任何给定表达式。
Sr.No. | DAX 函数和返回值 |
---|---|
1 |
TOTALMTD (Expression, Date_Column, [SetFilter]) 在当前上下文中计算本月至今日期的表达式值。 |
2 |
TOTALQTD (Expression, Date_Column, [SetFilter]) 在当前上下文中计算季度至今日期的表达式值。 |
3 |
TOTALYTD (Expression, Date_Column, [SetFilter], [YE_Date]) 在当前上下文中计算年初至今日期的表达式值 |
-
此类别中的六 (6) 个 DAX 函数可用于计算期初和期末余额。
-
任何期间的期初余额与上一期间的期末余额相同。
-
期末余额包括期末的所有数据,而期初余额不包括本期的任何数据。
-
这些 DAX 函数始终返回针对特定时间点计算的表达式的值。
-
-
我们关心的时间点始终是日历周期中最后一个可能的日期值。
-
期初余额基于上一期间的最后日期,而期末余额则基于当前期间的最后日期。
-
当前期间始终由当前日期上下文中的最后一个日期确定。
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 – 筛选函数
DAX 具有强大的筛选功能,与 Excel 功能截然不同。查找功能通过使用表和关系来工作,就像数据库一样。过滤功能使您可以操作数据上下文以创建动态计算。
注意– 返回表的 DAX 过滤器函数不会将该表添加到数据模型中。结果表用作另一个 DAX 函数中的参数。也就是说,此类 DAX 函数用作与其他 DAX 函数的嵌套函数。
在下一节中,您将了解可以使用哪些 DAX 过滤器函数。有关这些函数的更多详细信息,请参阅本教程库中的教程 – DAX 函数。
DAX 过滤器函数
以下是 DAX 过滤器功能 –
Sr.No. | DAX 函数和函数的作用是什么? |
---|---|
1 |
ADDMISSINGITEMS (<showAllColumn>, [<showAllColumn>] …, <table>, <groupingColumn>, [<groupingColumn>] …, [filterTable] …) 将多个列中的项目组合添加到表中(如果它们尚不存在)。要添加哪些项目组合的确定基于引用包含列的所有可能值的源列。 确定来自不同列的项目组合进行评估 –
|
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 函数
计算 (<表达式>, [<filter1>], [<filter2>]…)
CALCULATE 函数在由零个或多个指定过滤器修改的上下文中计算给定表达式。
如果您的数据已被过滤,CALCULATE 函数会更改过滤数据的上下文,并在您由过滤器指定的新上下文中计算表达式。这意味着,指定列上的任何现有过滤器都将被删除,并改为应用过滤器参数中使用的过滤器。
例子
假设您想显示按国家名称过滤的运动奖牌百分比。您的计算应该获得覆盖您在数据透视表中的 Country 上应用的过滤器的百分比值。
-
定义一个计算字段 – 奖牌计数百分比,如下面的屏幕截图所示。
使用此 DAX 公式,结果表中的所有行都在 CALCULATE 函数中被考虑在内,过滤器包含 ALL 函数。这样,您就有了分母中的总数。
您的数据透视表将如以下屏幕截图所示。
在上面的屏幕截图中,国家被过滤为美国,前 18 个值显示在数据透视表中。接下来,您可以动态过滤数据透视表中的值。但是,根据您使用的自定义 DAX 公式,计算将是正确的。
CALCULATETABLE 函数采用值表并执行与 CALCULATE 函数相同的操作。
过滤公式中的数据
您可以在 DAX 公式中创建过滤器,以从源数据中选择用于计算的值。您可以通过定义过滤器表达式并将其与作为 DAX 公式输入的表一起使用来完成此操作。
过滤器表达式使您能够获取源数据的子集。每次更新 DAX 公式的结果时都会动态应用过滤器,具体取决于数据的当前上下文,您可以确保获得准确和预期的结果。
过滤器表达式通常包含一个 DAX 过滤器函数,该函数仅返回表中选定的行,然后可以将其用作另一个用于数据聚合的 DAX 函数的参数。
例子
以下屏幕截图显示了计算字段的定义,该字段仅提供夏季运动的奖牌数。
使用此计算字段,数据透视表如下面的屏幕截图所示。
如您所见,右侧数据透视表中的值与新计算字段与左侧数据透视表中的值匹配,并明确应用了季节字段的过滤器。
注意– 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 函数需要参数的日期时间数据类型。
如果您的数据源包含不同格式的日期,您需要首先使用 DAX 公式提取日期部分并将这些部分组合起来以构成有效的 DAX 日期时间数据类型。
您可以使用以下 DAX 函数来提取和编写日期 –
DATE – 以日期时间格式返回指定的日期。
DATEVALUE – 将文本形式的日期转换为日期时间格式的日期。
TIMEVALUE – 将文本格式的时间转换为日期时间格式的时间。
定义自定义日期格式
假设数据源中的日期没有以标准格式表示。您可以定义自定义日期格式以确保正确处理值。DAX FORMAT 函数使您可以根据指定的格式将值转换为文本。
FORMAT (<value>, <format_string>)
FORMAT 函数返回一个字符串,其中包含由 format_string 定义的格式化值。
您可以使用预定义的日期和时间格式,也可以为 FORMAT 函数的参数 format_string 创建用户定义的日期和时间格式。
以下是预定义的日期和时间格式名称。如果您使用这些预定义字符串以外的字符串,它们将被解释为自定义日期和时间格式。
S. No. | Format_String & 描述 |
---|---|
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. | 字符和描述 |
---|---|
1 |
: 时间分隔符。 时间分隔符。在格式化时间值时分隔小时、分钟和秒。 |
2 |
/ 日期分隔符。 在格式化日期值时分隔日、月和年。 |
3 |
% 用于指示以下字符应作为单字母格式读取,而不考虑任何尾随字母。也用于指示将单字母格式读取为用户定义的格式。 |
以下是各种角色的详细信息。
-
%d – 将日期显示为没有前导零的数字(例如 5)。
-
%dd – 将日期显示为带有前导零的数字(例如 05)。
-
%ddd – 将日期显示为缩写(例如 Sun)。
-
%dddd – 将日期显示为全名(例如星期日)。
-
%M – 将月份显示为没有前导零的数字(例如,一月表示为 1)。
-
%MM – 将月份显示为带有前导零的数字(例如,一月表示为 01)。
-
%MMM – 将月份显示为缩写(例如,一月表示为一月)。
-
%MMMM – 将月份显示为完整的月份名称(例如一月)。
-
%gg – 显示时期/时代字符串(例如 AD)。
-
%h – 使用 12 小时制(例如下午 1:15:15)将小时显示为没有前导零的数字。如果这是用户定义的数字格式中的唯一字符,请使用%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>) – 将数字向上舍入到最接近的整数或最接近的重要性倍数,并返回一个十进制数。
FLOOR (<number>, <significance>) – 将一个数字向下舍入到零,到最接近的重要性倍数并返回一个十进制数。
将实数、整数或日期转换为字符串
您可以使用以下 DAX 函数将实数、整数或日期转换为字符串 –
FIXED (<number>, [<decimals>], [<no_comma>]) – 舍入一个数字并将结果作为文本返回。小数点右边的位数为 2 或指定的小数位数。结果是带逗号或可选不带逗号。
FORMAT (<value>, <format_string>) – 根据指定的格式将值转换为文本。
您已经了解了如何使用 Format 函数将日期转换为字符串。
将字符串转换为实数或日期
您可以使用以下 DAX 函数将字符串转换为实数或日期 –
VALUE (<text>) – 将表示数字的文本字符串转换为数字。
DATEVALUE (date_text) – 将文本形式的日期转换为日期时间格式的日期。
TIMEVALUE (time_text) – 将文本格式的时间转换为日期时间格式的时间。
条件值和错误测试
您可以使用 DAX 函数来测试数据中根据条件产生不同值的值。例如,您可以测试年销售额并根据结果将经销商标记为首选或价值。
您还可以使用 DAX 函数检查值的范围或类型,以防止意外数据错误破坏计算。
根据条件创造价值
您可以使用嵌套的 IF 条件来测试值并有条件地生成新值。以下 DAX 函数可用于条件处理和条件值 –
IF (<logical_test>,<value_if_true>, [<value_if_false>]) – 检查是否满足条件。如果条件为 TRUE,则返回一个值,如果条件为 FALSE,则返回另一个值。Value_if_false 是可选的,如果省略并且条件为 FALSE,则函数返回 BLANK()。
OR (<logical1>,<logical2>) – 检查参数之一是否为 TRUE 以返回 TRUE。如果两个参数都为 FALSE,则该函数返回 FALSE。
CONCATENATE (<text1>, <text2>) – 将两个文本字符串连接成一个文本字符串。连接的项目可以是文本、数字或表示为文本的布尔值或这些项目的组合。如果列包含适当的值,您还可以使用列引用。
测试 DAX 公式中的错误
在 DAX 中,计算列的一行中不能有有效值,另一行中不能有无效值。也就是说,如果计算列的任何部分存在错误,整个列都会被标记为错误,您必须更正 DAX 公式以删除导致无效值的错误。
DAX 公式中的一些常见错误是 –
- 被零除。
- 函数的参数为空,而预期的参数是数值。
您可以结合使用逻辑函数和信息函数来测试错误并始终返回有效值以避免在计算列中返回错误。以下 DAX 函数可帮助您解决此问题。
ISBLANK (<value>) – 检查值是否为空并返回 TRUE 或 FALSE。
IFERROR (value, value_if_error) – 如果第一个参数中的表达式导致错误,则返回 value_if_error。否则,返回表达式本身的值。
表达式的返回值和 value_if_error 的数据类型必须相同。否则,您将收到错误消息。
Excel DAX – 使用时间智能
您已经在“理解时间智能”一章中了解了 DAX 强大的时间智能功能。在本章中,您将学习如何在各种场景中使用 DAX 时间智能功能。
DAX 时间智能功能包括 –
-
帮助您从数据中检索日期或日期范围的函数,用于计算相似时期的值。
-
使用标准日期间隔的函数,允许您跨月、年或季度比较值。
-
检索指定时间段的第一个和最后一个日期的函数。
-
帮助您处理期初和期末余额的功能。
计算累计销售额
您可以使用 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>]) – 在当前上下文中评估一年中第一个日期的表达式。
您可以使用以下 DAX 函数在指定时间为产品库存创建以下计算字段 –
月份开始库存值:= OPENINGBALANCEMONTH ( SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
月末库存价值:= CLOSINGBALANCEMONTH ( SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
季度开始库存值:= OPENINGBALANCEQUARTER ( SUMX ProductInventory, (ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
季末库存值:= CLOSINGBALANCEQUARTER ( SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
年起始库存值:= OPENINGBALANCEYEAR ( SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
年终库存价值:= CLOSINGBALANCEYEAR ( SUMX (ProductInventory, ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey] )
比较不同时间段的值
DAX 支持的默认时间段是月、季度和年。
您可以使用以下 DAX 时间智能函数来比较不同时间段的总和。
-
PREVIOUSMONTH (<dates>) – 根据当前上下文中的日期列中的第一个日期,返回一个包含上个月所有日期的列的表。
-
PREVIOUSQUARTER (<dates>) – 根据当前上下文中日期列中的第一个日期,返回一个包含上一季度所有日期的列的表。
-
PREVIOUSYEAR (<dates>, <year_end_date>]) – 在当前上下文中,给定日期列中的最后一个日期,返回一个包含前一年所有日期列的表。
您可以使用 DAX 函数创建以下计算字段,用于计算指定时间段内西部地区的销售额总和以进行比较 –
上个月销售额:= 计算 ( SUM (WestSales[SalesAmount]), PREVIOUSMONTH (DateTime [DateKey]) )
上一季度销售额:= 计算 ( SUM (WestSales[SalesAmount]), PREVIOUSQUARTER (DateTime [DateKey]) )
上一年的销售额:= 计算 ( SUM (WestSales[SalesAmount]), PREVIOUSYEAR (DateTime [DateKey]) )
比较平行时间段的值
您可以使用 DAX 时间智能函数 PARALLELPERIOD 来比较与指定时间段平行的时间段内的总和。
PARALLELPERIOD (<dates>, <number_of_intervals>, <interval>)
此 DAX 函数返回一个表,其中包含一列日期,表示与指定日期列中的日期平行的时间段,在当前上下文中,日期在时间上向前或向后移动了多个间隔。
您可以创建以下计算字段来计算西部地区上一年的销售额 –
上一年的销售额:= 计算 ( SUM (West_Sales[SalesAmount]), PARALLELPERIOD (DateTime[DateKey],-1,year) )
计算运行总计
您可以使用以下 DAX 时间智能函数来计算运行总计或运行总和。
-
TOTALMTD (<expression>,<dates>, [<filter>]) – 评估当前上下文中当月至今的表达式值。
-
TOTALQTD (<expression>,<dates>, <filter>]) – 在当前上下文中评估季度至今日期的表达式值。
-
TOTALYTD (<expression>,<dates>, [<filter>], [<year_end_date>]) – 评估当前上下文中表达式的年初至今值。
您可以使用 DAX 函数创建以下计算字段,用于计算指定时间段内西部地区的销售总和 –
月份运行总和:= TOTALMTD(SUM(West_Sales[SalesAmount]),DateTime[DateKey])
季度运行总和:= TOTALQTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])
年累计总和:= TOTALYTD (SUM (WestSales[SalesAmount]), DateTime[DateKey])
计算自定义日期范围内的值
您可以使用 DAX 时间智能函数来检索一组自定义日期,您可以将其用作执行计算的 DAX 函数的输入,以创建跨时间段的自定义聚合。
DATESINPERIOD (<dates>, <start_date>, <number_of_intervals>, <interval>) – 返回一个表,其中包含以 start_date 开始并继续指定 number_of_intervals 的日期列。
DATESBETWEEN (<dates>, <start_date>,
DATEADD (<dates>,<number_of_intervals>,<interval>) – 返回一个包含一列日期的表,从当前上下文中的日期向前或向后移动指定的时间间隔数。
FIRSTDATE (<dates>) – 返回指定日期列的当前上下文中的第一个日期。
LASTDATE (<dates>) – 返回指定日期列的当前上下文中的最后一个日期。
您可以使用 DAX 函数创建以下 DAX 公式,用于计算指定日期范围内西部地区的销售额总和 –
-
用于计算 2016 年 7 月 17 日之前 15 天销售额的 DAX 公式。
计算 ( SUM (WestSales[SalesAmount]), DATESINPERIOD (DateTime[DateKey], DATE(2016,17,14), -15, day) )
-
DAX 公式,用于创建计算 2016 年第一季度销售额的计算字段。
= 计算 ( SUM (WestSales[SalesAmount]),DATESBETWEEN (DateTime[DateKey], DATE (2016,1,1), DATE (2016,3,31)) )
-
DAX 公式创建一个计算字段,用于获取当前上下文中西部地区进行销售的第一个日期。
= FIRSTDATE (WestSales [SaleDateKey])
-
DAX 公式创建一个计算字段,用于获取当前上下文中西部地区进行销售的最后日期。
= 最后日期(WestSales [SaleDateKey])
-
DAX 公式计算当前上下文中日期之前一年的日期。
= DATEADD (DateTime[DateKey],-1,year)
Excel DAX – 排名和比较值
如果您只想显示列或数据透视表中的前n个项目,您有以下两个选项 –
-
您可以在数据透视表中选择n个最高值。
-
您可以创建动态排列值的 DAX 公式,然后在切片器中使用排列值。
应用过滤器以仅显示前几项
要选择n个要在数据透视表中显示的最高值,请执行以下操作 –
- 单击数据透视表中行标签标题中的向下箭头。
- 单击下拉列表中的值过滤器,然后单击前 10。
出现前 10 个过滤器(<列名称>)对话框。
- 在“显示”下,从左到右的框中选择以下内容。
- 最佳
- 18(要显示的最高值的数量。默认值为 10。)
- 项目。
- 在依据框中,选择奖牌计数。
-
单击确定。前 18 个值将显示在数据透视表中。
应用过滤器的优缺点
优点
- 它简单易用。
- 适用于具有大量行的表。
缺点
-
过滤器仅用于显示目的。
-
如果数据透视表的基础数据发生更改,您必须手动刷新数据透视表以查看更改。
创建动态排列值的 DAX 公式
您可以使用包含排名值的 DAX 公式创建计算列。然后,您可以在生成的计算列上使用切片器来选择要显示的值。
您可以通过计算同一表中值大于正在比较的行的行数来获得行中给定值的排名值。此方法返回以下内容 –
-
表中最高值的零值。
-
相等的值将具有相同的等级值。如果n个值相等,则相等值之后的下一个值将有一个非连续的排名值与n相加。
例如,如果您有一个包含销售数据的“销售额”表,您可以创建一个计算列,其中包含销售额值的排名,如下所示 –
= COUNTROWS (FILTER (Sales, EARLIER (Sales [Sales Amount]) < Sales [Sales Amount]) ) + 1
接下来,您可以在新的计算列上插入一个切片器,并按等级有选择地显示值。
动态排名的优缺点
优点
-
排名是在表格中完成的,而不是在数据透视表上完成的。因此,可以在任意数量的数据透视表中使用。
-
DAX 公式是动态计算的。因此,即使基础数据发生了变化,您也始终可以确保排名是正确的。
-
由于 DAX 公式用于计算列,因此您可以在切片器中使用排名。
-
适用于具有大量行的表。
缺点
由于 DAX 计算的计算成本很高,因此此方法可能不适合具有大量行的表。