数据分析表达式 (DAX) 概述
数据分析表达式 (DAX) 语言是一种公式语言,允许用户在 PowerPivot 表(“计算列”)和 Excel 数据透视表(“度量值”)中定义自定义计算。DAX 包含一些在 Excel 公式中使用的函数,此外还包含其他设计用于处理关系数据和执行动态聚合的函数。
本部分解释以下概念:
DAX 公式的使用位置
如何创建 DAX 公式
通过 DAX 可以执行的操作类型
DAX 公式概述
DAX 公式与 Excel 公式非常相似。要创建 DAX 公式,请键入一个等号,后跟函数名或表达式以及所需的任何值或参数。与 Excel 类似,DAX 提供多种函数,可用于处理字符串、使用日期和时间执行计算或者创建条件值。
然而,DAX 公式在以下几个重要方面却有所不同:
DAX 函数始终引用完整的列或表。如果您想要仅使用表或列中的特定值,则可以向公式中添加筛选器。
如果想要逐行自定义计算,PowerPivot 可提供允许您使用当前行值或相关值执行计算(因上下文而异)的函数。
DAX 包含一种函数,此类函数返回表作为其结果,而不是返回单个值。这些函数可用于向其他函数提供输入,以便计算整个表或列的值。
一些 DAX 函数提供“时间智能”,通过该功能,您可以使用有效日期范围创建计算,并比较并行时间段内的结果。
公式的使用位置
您可以在 PowerPivot 表中或者 Excel 的数据透视表中使用 DAX 公式:
您可以通过添加列,然后在公式栏中键入一个表达式,在“计算列”中使用公式。您在 PowerPivot 窗口中创建这些公式。有关详细信息,请参阅创建计算列。
您可以在“度量值”中使用公式。可以通过在现有 PowerPivot 数据透视表或数据透视图中单击**“添加度量值”**,在 Excel 中创建这些公式。有关详细信息,请参阅创建度量值。
根据公式的使用位置是在计算列中还是度量值中,相同的公式在行为上可能有所不同。在计算列中,公式始终应用于列中的每一行,在整个表中均如此。根据行上下文,值可能会发生变化。但在度量值中,结果的计算强烈依赖于上下文。也就是说,数据透视表的设计以及行和列标题的选择将会影响在计算中使用的值。有关详细信息,请参阅DAX 公式中的上下文。
使用公式栏创建公式
与 Excel 类似,PowerPivot 提供了公式栏和记忆式键入功能,前者使用户可以更方便地创建和编辑公式,后者可以尽量减少键入和语法错误。
输入表名称 开始键入表名称。公式记忆式键入功能会提供一个下拉列表,其中包含以这些字母开头的有效名称。
输入列名称 键入括号,然后从当前表的列清单中选择列。对于其他表中的列,首先键入表名称的前几个字母,然后从记忆式键入下拉列表中选择该列。
有关如何开发生成公式的演练,请参阅为计算生成公式。
使用记忆式键入的提示
可以在具有嵌套函数的现有公式中使用公式记忆式键入功能。刚好在插入点之前的文本将用于显示下拉列表中的值,并且插入点之后的所有文本都保持不变。
您为常量创建的定义的名称不显示在记忆式键入下拉列表中,但您仍可以键入它们。
PowerPivot 不添加函数的右括号或自动匹配括号。您必须确保每个函数在语法上都是正确的,否则不能保存或使用公式。
在公式中使用多个函数
您可以嵌套函数,这意味着您可以使用一个函数的结果作为另一个函数的参数。在计算列中,最多可以嵌套 64 个级别的函数。但是,嵌套可能会导致很难创建公式或者排除公式问题。
许多 PowerPivot 函数设计为仅用作嵌套函数。这些函数返回一个表,该表不能直接作为结果保存到 PowerPivot 工作簿中;它必须作为表函数的输入提供。例如,函数 SUMX、AVERAGEX 和 MINX 全都要求将表作为第一个参数。
注意 |
---|
在度量值内嵌套函数时有一些限制,以确保不会由于列之间的依赖关系所要求的许多计算而影响性能。 |
比较 DAX 函数和 Excel 函数
DAX 函数库基于 Excel 函数库,但有许多差异。本节总结了 Excel 函数与 DAX 函数之间的差异和相似性。
许多 DAX 函数的名称和一般行为都与 Excel 函数相同,但这些函数已修改为采用不同类型的输入,因此在有些情况下可能会返回不同的数据类型。通常,如果不进行某些修改,则无法在 Excel 工作簿中使用 DAX 公式,或在 PowerPivot 工作簿中使用 Excel 公式。
DAX 函数从不将单元范围或范围作为引用,而是采用列或表。
DAX 日期和时间函数返回 datetime 数据类型。与之相比,Excel 日期和时间函数返回将日期表示为序列号的整数。
许多新的 DAX 函数返回值表,或基于作为输入的值表进行计算。相反,Excel 没有返回表的函数,但某些函数可以使用数组。能够轻松地引用完整的表和列是 PowerPivot 中的新功能。
DAX 提供了新的查找函数,这些函数类似于 Excel 中的数组和矢量查找函数。但是,DAX 函数需要在表之间建立关系。
DAX 不支持 Excel 中的 variant 数据类型。列中的数据应该始终具有相同的数据类型。如果数据类型不同,DAX 会更改整个列,以使其具有最适合所有值的数据类型。
返回页首
DAX 数据类型
您可以将数据从可能支持不同数据类型的众多不同数据源导入 PowerPivot 工作表。在将数据导入或加载到工作簿,然后在计算或数据透视表中使用这些数据时,数据会转换为 PowerPivot 数据类型之一。有关数据类型的列表,请参阅 PowerPivot 工作簿中支持的数据类型。
表数据类型是 DAX 中的一种新数据类型,用作许多新函数的输入或输出。例如,FILTER 函数采用表作为输入,并输出仅包含满足筛选条件的行的另一个表。通过组合表函数与聚合函数,您可以对动态定义的数据集执行复杂计算。有关详细信息,请参阅公式中的聚合。
返回页首
公式和关系模型
PowerPivot 窗口是一个区域,您可以在其中使用多个数据表,并通过“关系模型”连接这些表。在此模型中,表通过关系相互连接,这样,您就可以创建与其他表中列的关联,并创建更有用的计算。例如,可以创建对相关表的值进行求和的公式,然后将该值保存在一个单元中。或者,您可以对表和列应用筛选器,以便控制相关表中的行。有关详细信息,请参阅关系概述。
由于可以使用关系来链接表,因此您的数据透视表还可以包含来自不同表中多个列的数据。
但是,由于公式可以处理整个表和列,因此您需要设计与在 Excel 中不同的计算。
通常,列中的 DAX 公式会始终应用于列中的整个值集(而不会仅应用于几个行或单元)。
PowerPivot 中表的每一行必须始终具有相同数量的列,并且一列中的所有行必须包含相同的数据类型。
在通过关系连接多个表时,您应该确保用作键的两列对于大多数部分具有匹配的值。因为 PowerPivot 不强制引用完整性,所以,有可能在键列中具有不匹配值的情况下仍创建关系。但是,空值或不匹配的值可能影响公式的结果和数据透视表的外观。
使用关系在工作簿中链接表时,可以扩大公式的计算范围(即,“上下文”)。例如,数据透视表中的公式可能受该数据透视表中任何筛选器或者列和行标题的影响。您可以编写处理上下文的公式,但上下文还可能以各种意外方式导致结果发生变化。有关详细信息,请参阅DAX 公式中的上下文。
返回页首
计算列和度量值
可以在 PowerPivot 中的“计算列”或“度量值”中创建公式。
计算列
计算列是添加到现有 PowerPivot 表中的列。您可以创建用于定义列值的 DAX 公式,而不是在列中粘贴或导入值。如果您在某个数据透视表(或数据透视图)中包括 PowerPivot 表,则您可以像使用任何其他数据列一样使用计算列。
计算列中的公式非常类似于您在 Excel 中创建的公式。但与在 Excel 中不同,您不能为表中的不同行创建不同公式;而是 DAX 公式自动应用于整个列。
在某个列包含公式时,将为每一行都计算值。一旦创建公式后,将立即为列计算结果。只有在刷新基础数据或者使用手动重新计算时,才重新计算列值。
您可以创建基于度量值和其他计算列的计算列。但是,请避免将同一名称用于计算列和度量值,因为这可能导致混乱的结果。引用列时,最好使用完全限定的列引用,以避免无意中调用度量值。
度量值
度量值是为用于使用 PowerPivot 数据的数据透视表(或数据透视图)而专门创建的公式。度量值可以基于标准聚合函数,如 COUNT 或 SUM;或者,您可以通过使用 DAX 定义自己的公式。度量值用于数据透视表的**“值”**区域中。如果您想要将计算的结果放置于数据透视表的不同区域中,则应改为使用计算列。
若要创建度量值,您必须首先将数据透视表或数据透视图添加到您的 PowerPivot 工作簿中。为某个度量值定义公式时,在将该度量值拖放到数据透视表中之前不会发生任何操作。在添加度量值时,对数据透视表的**“值”**区域中的每个单元计算该公式。因为会为每个行和列标题组合都创建一个结果,所以度量值的结果在每个单元中可能会不同。
您创建的度量值的定义与其源数据表一起保存。它出现在 PowerPivot 字段列表中并且可用于工作簿的所有用户。
返回页首
更新公式的结果
“数据刷新”和“重新计算”是两个独立但相关的操作,在设计包含复杂公式、大量数据或从外部数据源获取的数据的数据模型时,应了解这两项操作。
“刷新数据”是用外部数据源的新数据更新工作簿中数据的过程。您可以按指定的时间间隔手动刷新数据。或者,如果您已将工作簿发布到 SharePoint 网站,则可以从外部源安排自动刷新。
“重新计算”是对工作簿中的公式和计算列的结果进行更新的过程,用于反映对公式的任何更改以及基础数据中的更改。重新计算会以下列方式影响性能:
对于计算列,每当您更改公式时,必须始终针对整个列重新计算公式的结果。
但是对于度量值来说,在将度量值放到数据透视表或数据透视图的上下文中之前,将不对公式的结果进行计算。在更改可影响数据筛选器的任何行或列标题时,或在手动刷新数据透视表时,也将重新计算公式。
有关详细信息,请参阅以下主题:
返回页首