Power Pivot 中的数据分析表达式 (DAX)

Power Pivot 中的数据分析表达式 (DAX)

Data Analysis Expressions (DAX) 乍听起来有点唬人,但可别让这名字把您给骗了。 DAX 基础知识其实很容易理解。 首先说最重要的一点 — DAX 不是编程语言。 DAX 是一种公式语言。 可使用 DAX 来定义计算列度量(也称为计算字段)的自定义计算。 DAX 包含一些在 Excel 公式中使用的函数,此外还包含其他用于处理关系数据和执行动态聚合的函数。

了解 DAX 公式

DAX 公式与 Excel 公式非常相似。 要创建一个 DAX 公式,只需键入一个等号,后跟函数名或表达式以及所需的任何值或参数即可。 与 Excel 类似,DAX 提供多种函数,可用于处理字符串、使用日期和时间执行计算或者创建条件值。

但 DAX 公式在以下几个重要方面却有所不同:

  • 如果您希望逐行自定义计算,DAX 提供了允许您使用当前行值或相关值执行计算(因上下文而异)的函数。

  • DAX 包含一类函数,此类函数返回表作为其结果,而不是返回单个值。 这些函数可用于提供其他函数的输入。

  • 时间智能函数,可按照日期范围进行计算,也可比较并行时间段内的结果。

使用 DAX 公式的位置

在Power Pivot中的计算计算字段中可以创建公式。

计算列

计算列是添加到现有 Power Pivot 表中的列。 无需粘贴或导入值,您可以在计算列中创建用于定义列值的 DAX 公式。 如果某个数据透视表(或数据透视图)中包括 Power Pivot 表,则可以像使用任何其他数据列一样使用计算列。

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

当某列中包含公式时,将为每一行都计算值。 一旦创建公式就将立即为列计算结果。 只有在刷新基础数据或者手动重新计算时,才重新计算列值。

可创建基于计算度量和其他计算列的计算列。 但请勿将同一名称既用于计算列又用于度量,因为这可能导致结果混乱。 引用列时,最好使用完全限定的列引用,以避免无意中调用度量。

有关更多详细信息,请参阅 Power Pivot 中的计算列

度量

度量是一种公式,专门创建用于使用 Power Pivot 数据的数据透视表(或数据透视图)。 度量可基于标准聚合函数,如 COUNT 或 SUM;你也可使用 DAX 自行定义公式。 度量在数据透视表的“”区域中使用。 如果希望将计算得出的结果放置在数据透视表的其他区域,则应改用计算列。

为某个显式度量定义公式时,在将该度量添加到数据透视表中之前,不会发生任何操作。 在添加度量时,对数据透视表的“”区域中的每个单元计算该公式。 由于会为每个行和列标题组合都创建一个结果,因此度量的结果在每个单元格中可能有所不同。

所创建的度量的定义随附其源数据表一并保存。 它出现在数据透视表字段列表中,可供工作簿的所有用户使用。

有关更多详细信息,请参阅 Power Pivot 中的度量

使用编辑栏创建公式

与 Excel 相似,Power Pivot 提供的编辑栏让创建和编辑公式更方便,以及记忆式键入功能,尽量减少键入和语法错误。

输入表格名称   开始键入表格的名称。 公式自动完成功能提供了一个下拉列表,其中包含以这些字母开头的有效名称。

输入列的名称   键入方括号,然后从当前表格的列列表中选择列。 对于来自其他表格的列,请先键入表格名称的前几个字母,然后从“自动完成”下拉列表中选择列。

有关如何构建公式的详细信息和演练,请参阅在 Power Pivot 中创建计算公式

使用记忆式键入的提示

可以在具有嵌套函数的现有公式中使用公式记忆式键入功能。 与插入点紧邻的前一个文本用于显示下拉列表中的值,插入点之后的所有文本都保持不变。

“自动完成”下拉列表中不显示为常量创建且已定义的名称,但你仍可键入它们。

Power Pivot 不会添加函数的右括号或自动匹配括号。 您应确保每个函数在语法上都是正确的,否则就不能保存或使用公式。 

在公式中使用多个函数

可以嵌套函数,这意味着您可以使用一个函数的结果作为另一个函数的参数。 在计算列中,最多可以嵌套 64 层函数。 但是,嵌套可能会导致很难创建公式或者排除公式问题。

许多 DAX 函数设计为仅用作嵌套函数。 这些函数返回一个表,该表不能直接保存为结果, 而应作为表函数的输入提供。 例如,函数 SUMX、AVERAGEX 和 MINX 全都要求将表作为第一个参数。

注意: 在度量内嵌套函数时存在一些限制,目的是确保列之间的依赖关系所要求的大量计算不会影响性能。

比较 DAX 函数和 Excel 函数

DAX 函数库基于 Excel 函数库,但这两种库有许多差异。 本节总结了 Excel 函数与 DAX 函数之间的差异和相似性。

  • 许多 DAX 函数名称和常规行为都与 Excel 函数相同,但这些函数已修改为采用不同类型的输入,因此在有些情况下可能会返回不同的数据类型。 通常,如果不进行某些修改,无法在 Excel 公式中使用 DAX 函数或在 Power Pivot 中使用 Excel 公式。

  • DAX 函数不会将单元引用或范围作为引用,而是将列或表作为引用。

  • DAX 日期和时间函数返回 datetime 数据类型。 与之相比,Excel 日期和时间函数返回将日期表示为序列数的整数。

  • 许多新的 DAX 函数返回值表,或基于值表作为输入进行计算。 与之相比,Excel 没有返回表的函数,但某些函数可以使用数组。 能够轻松地引用完整的表和列是 Power Pivot 中的新功能。

  • DAX 提供了新的查找函数,这些函数类似于 Excel 中的数组和矢量查找函数。 但这些 DAX 函数需要在表之间建立关系。

  • 列中的数据应该始终具有相同的数据类型。 如果数据类型不同,DAX 会更改整个列,以使其具有最适合所有值的数据类型。

DAX 数据类型

您可以将数据从可能支持不同数据类型的多种数据源导入 Power Pivot 数据模型中。 在导入或加载数据,然后在计算或数据透视表中使用这些数据时,数据会转换为 Power Pivot 数据类型之一。 有关数据类型的列表,请参阅数据模型中的数据类型

表数据类型是 DAX 中的一种新数据类型,用作许多新函数的输入或输出。 例如,FILTER 函数采用表作为输入,并输出仅包含满足筛选条件的行的另一个表。 通过组合表函数与聚合函数,可以对动态定义的数据集执行复杂计算。 有关详细信息,请参阅 Power Pivot 中的聚合

公式和关系模型

Power Pivot 窗口是一个区域,您可以在其中使用多个数据表,并通过“关系模型”将这些表连接起来。 在此数据模型中,表通过关系相互连接,这样,您就可以创建与其他表中的列的关联,并创建更有用的计算。 例如,可以创建对相关表的值进行求和的公式,然后将该值保存在一个单元格中。 或者,您可以对表和列应用筛选器,以便控制相关表中的行。 有关详细信息,请参阅数据模型中表之间的关系

由于可以使用关系来链接表,因此数据透视表还可以包含来自不同表中多个列的数据。

但是,由于公式可以处理整个表和列,因此您需要设计与在 Excel 中不同的计算。

  • 通常,列中的 DAX 公式始终应用于列中的整个值集(而不是仅应用于几个行或单元格)。

  • Power Pivot 中表的每一行必须始终具有相同的列数,并且一列中的所有行必须包含相同的数据类型。

  • 在通过关系连接多个表时,您应该确保用作键的两列对于大多数部分具有匹配的值。 因为 Power Pivot 不强制引用完整性,所以,当键列中具有不匹配的值时,仍有可能创建关系。 但是,空值或不匹配的值可能影响公式的结果和数据透视表的外观。 有关详细信息,请参阅 Power Pivot 公式中的查找

  • 使用关系链接表时,可以扩大计算公式的范围(或“下文”)。 例如,数据透视表中的公式可能受该数据透视表中任何筛选器或者列和行标题的影响。 您可以编写处理上下文的公式,但上下文还可能以各种意外方式导致结果发生变化。 有关详细信息,请参阅 DAX 公式中的上下文

更新公式的结果

数据刷新”和“重新计算”是两个各自独立而又有相关性的操作,在设计包含复杂公式、大量数据或从外部数据源获取的数据的数据模型时,应了解这两项操作。

“刷新数据”是用外部数据源的新数据更新工作簿中数据的过程。 您可以按指定的时间间隔手动刷新数据。 或者,如果您已将工作簿发布到 SharePoint 网站,则可以从外部源安排自动刷新。

重新计算是对公式结果进行更新的过程,用于反映对公式本身的任何更改以及基础数据中的那些更改。 重新计算会以下列方式影响性能:

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

  • 对于度量,在将度量放到数据透视表或数据透视图的上下文中之前,不对公式的结果进行计算。 在更改可影响数据筛选器的任何行或列标题时,或在手动刷新数据透视表时,也会重新计算公式。

公式疑难解答

编写公式时出错

如果定义公式时遇到错误,公式中可能包含语法错误语义错误计算错误

语法错误是最容易解决的。 此类错误通常涉及缺少括号或逗号。 有关各个函数的语法的帮助,请参阅“DAX 函数参考”。

当语法正确而值或列引用对公式上下文无意义时,就会发生其他类型的错误。 以下任何问题都可能导致此类语义和计算错误:

  • 公式引用了非现有的列、表或函数。

  • 公式看起来是正确的,但当数据引擎提取数据时找到的类型却不匹配,从而引发错误。

  • 公式为函数传递的数字或参数类型不正确。

  • 公式引用了另一个出错的列,因此它的值无效。

  • 公式引用了尚未处理的列,这意味着虽然它具有元数据,但没有用于计算的实际数据。

在前四种情况下,DAX 会标记包含无效公式的整个列。 在最后一种情况下,DAX 灰显该列来指示该列处于未处理状态。

对列值进行排名或排序时,结果不正确或异常

对包含值 NaN (非数字)的列进行排名或排序时,可能会获得不正确或意外的结果。 例如,当计算 0 除以 0 时,返回结果 NaN。

这是因为公式引擎通过比较数值来执行排序或排名;但是 NaN 却无法与该列中的其他数字进行比较。

为了确保结果正确,您可以利用使用 IF 函数的条件语句来测试 NaN 值并返回数字 0 值。

与 Analysis Services 表格模型和 DirectQuery 模式的兼容性

通常,在 Power Pivot 中构建的 DAX 公式与 Analysis Services 表模型完全兼容。 但是,如果将 Power Pivot 模型迁移到某个 Analysis Services 实例,然后在 DirectQuery 模式下部署该模型,则存在一些限制。

  • 如果在 DirectQuery 模式下部署该模型,则某些 DAX 公式可能会返回不同的结果。

  • 在将模型部署到 DirectQuery 模式时,某些公式可能会导致验证错误,因为该公式包含关系数据源不支持的 DAX 函数。

有关详细信息,请参阅 SQL Server 2012 联机丛书中的 Analysis Services 表格模型文档。

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×