简介
通过使用数据分析表达式 (DAX),可以将三种类型的计算添加到语义模型中:
- 计算表
- 计算列
- 度量值
注意
DAX 还可以用来定义行级别安全性 (RLS) 规则,这些规则是对模型表强制执行筛选的表达式。 但是,规则并不被视为模型计算,因此它们不在本模块的范围内。 有关详细信息,请参阅 Power BI 行级别安全性 (RLS)。
计算表
可以编写一个 DAX 公式,向模型添加计算表。 该公式可以复制或转换现有模型数据,或创建一系列数据,以生成一个新表。 计算表数据始终被导入模型中,因此它会增加模型的存储大小,并会延长数据刷新时间。
注意
计算表无法连接到外部数据;需要使用 Power Query 来完成这个任务。
计算表在各种情况下都非常有用:
- Date 表
- 角色扮演维度
- 模拟分析
Date 表
Date 表需要应用被称为“时间智能”的特殊时间筛选器。 DAX 时间智能函数只有在设置了 Date 表时才能正常工作。 如果源数据不包含 Date 表,则可以使用 CALENDAR
或 CALENDARAUTO
DAX 函数创建一个计算表。
角色扮演维度
如果两个模型表具有多个关系,可能是因为你的模型具有角色扮演维度。 例如,如果你有一个名为 Sales 的表,其中包含两个日期列,即 OrderDateKey 和 ShipDateKey,这两个列都与 Date 表中的 Date 列有关。 在这种情况下,Date 表通过角色扮演维度描述,因为它可以作为“订单日期”或“发货日期”。
Microsoft Power BI 模型只允许两个表之间存在一种活动关系,这在模型关系图中用实线表示。 默认情况下,使用活动关系传播筛选器,本例中是从 Date 表传播到 Sales 表中的 OrderDateKey 列。 这两个表之间的其余所有关系都处于非活动状态。 在模型关系图中,这种关系用虚线表示。 只有在使用 USERELATIONSHIP
DAX 函数在计算公式中明确要求时,才会使用非活动关系。
在更好的模型设计中,也许可以有两个 Date 表,每个 Date 表与 Sales 表都具有一个活动关系。 这样一来,报表用户就可以按订单日期或发货日期筛选,或者同时筛选这两者。 计算表可以复制 Date 表数据以创建 Ship Date 表。
模拟分析
Power BI Desktop 支持模拟参数功能。 当你创建模拟参数时,你的模型中将自动添加一个计算表。
使用模拟参数的报表用户可以按存储在计算表中的值来选择或筛选。 度量值公式可以用一种有意义的方式使用所选的值。 例如,使用模拟参数的报表用户可以选择一个假定的货币汇率,而度量值可以将收入值(以当地货币表示)除以所选的汇率。
值得注意的是,模拟计算表不与其他模型表相关,因为它们不用来传播筛选器。 出于此原因,它们有时被称为“断开连接的表”。
计算列
可以编写一个 DAX 公式,向模型中的任意表添加计算列。 为每个表的行计算公式,这会返回单一值。 当添加到 Import 存储模式表时,公式将在刷新语义模型时进行评估,并增加模型的存储大小。 当添加到 DirectQuery 存储模式表时,在查询表时,由基础源数据库计算公式。
在“字段”窗格中,计算列用一个特殊的图标强调。 下面的示例展示了 Customer 表中名为“年龄”的单个计算列。
度量值
可以编写一个 DAX 公式,向模型中的任意表添加度量值。 此公式涉及到实现模型数据的汇总。 与计算列类似,此公式必须返回单一值。 与计算列不同的是,计算列是在数据刷新时计算的,而度量值是在查询时计算的, 其结果永远不会存储在模型中。
在“字段”窗格中,度量值用计算器图标显示。 下面的示例展示 Sales 表中的三个度量值:成本、利润和收入。
在某些情况下,度量值可以被描述为“显式度量值”。 明确地说,显式度量值是用 DAX 编写的模型计算,通常被简单地称为“度量值”。 然而,“隐式度量值”的概念也同样存在。 隐式度量值是指可通过视觉对象简单汇总的列,如计数、求和、最小值、最大值等。 可以在“字段”窗格中标识隐式度量值,因为它们以 Sigma 符号 (∑) 显示。
注意
在将任意列添加到视觉对象时,可以对这些列进行汇总。 因此,无论这几个度量值是否用 Sigma 符号显示,在将它们添加到视觉对象时,都可以将其设置为隐式度量值。
此外,在表格建模中,不存在计算度量值这种概念。 “计算”这个词是用来描述计算表和计算列的,这与源自 Power Query 的表和列有区别。 Power Query 不存在显式度量值的概念。