创建显式度量值
您可以通过编写 DAX 公式将度量值添加到模型中的任何表。 度量值公式必须返回单个值。 本部分介绍如何创建显式度量值。
度量值不会将值存储在模型中。 Power BI 会在查询时计算它们以汇总模型数据。 度量值无法直接引用表或列,因此必须使用函数来汇总数据。
简单度量值
简单 度量值聚合单个列的值,就像隐式度量值一样。
例如,您可以将度量值添加到 Sales 表。 在数据窗格中,选择 Sales 表。 在表工具功能区上,选择新建度量值。
以下公式创建名为 Revenue 的度量值。 此度量值使用 SUM 函数对 Sales Amount 列中的值进行总计。 如果将此度量值添加到 Sales Amount 隐式度量值旁边的表中,结果是相同的。
Revenue =
SUM(Sales[Sales Amount])
提示
添加度量值和隐藏列有助于报表作者改用显式度量值。
在度量值工具上下文功能区中,您可以设置度量值的格式,设置数据类型以及更改主表。 主表是指在查看数据窗格时度量值的显示位置。
提示
最佳做法是在创建度量值后直接设置格式设置选项。 这可确保您的值在所有报表视觉对象中以一致的方式显示。
假设您可能需要一个度量值来计算 Profit,如以下代码所示:
Profit =
SUM(Sales[Profit Amount])
在本示例中,Profit Amount 列是计算列。 此方法不是最佳方法,因为您不需要该列。 在下一部分中,您将了解如何创建直接计算利润的度量值,从而减小模型大小并缩短刷新时间。
以下代码创建两个不同的度量值来返回 Order Line Count 和 Order Count。
COUNT 函数对列中的非空值进行计数。
DISTINCTCOUNT 函数对唯一值进行计数。 由于订单可以有多个订单行,因此 Sales Order 列具有重复项。 使用 DISTINCTCOUNT,您可以获得正确的订单计数。
Order Line Count =
COUNT(Sales[SalesOrderLineKey])
Order Count =
DISTINCTCOUNT('Sales Order'[Sales Order])
您还可以使用 COUNTROWS 编写 Order Line Count 度量值,用于对表中的行数进行计数:
Order Line Count =
COUNTROWS(Sales)
引用的所有度量值都被视为简单度量值,因为它们聚合单个列或单个表。
创建复合度量值
复合度量值 引用一个或多个其他度量值。 例如,您可以通过引用其他度量值来重新定义 Profit 度量值。 可以使用此度量值,而不是前面引用的计算列。
Profit =
[Revenue] - [Cost]
模型的这一变化提供了一个重要经验:通过删除计算列,您可以优化语义模型,因为它会减小语义模型大小并缩短数据刷新时间。 考虑到所有情况,Profit Amount 计算列不是必需的,因为 Profit 度量值可以使用现有度量值直接生成所需的结果。
注意
有时,定义依赖于其他度量值的度量值是有意义的。 请务必仔细测试更改,因为更新可能会影响所有相关度量值。
使用“快速度量”
通过快速度量,您无需自行编写 DAX 即可执行常见计算。 Power BI 为您生成 DAX 表达式,帮助您学习和培养 DAX 技能。
例如,您可以使用快速度量来通过以下步骤创建 Profit Margin 度量值:
- 在“表工具”功能区中,选择“快速度量”。
- 选择“数学运算 > 除法”。
- 将
Profit度量值添加到分子中,并将Revenue添加到分母中。
新度量值显示在数据窗格中,您可以查看其 DAX 公式:
Profit Margin =
DIVIDE([Profit], [Revenue])
比较计算列和度量值
许多 DAX 初学者一开始可能会对计算列和度量值感到困惑。 两者都是使用 DAX 公式在语义模型中创建的,但是计算列和度量值的行为不同。
| 计算列 | 度量值 | |
|---|---|---|
| 目的 | 向表添加新列 | 定义如何汇总模型数据 |
| 评估 | 在数据刷新时使用行上下文进行评估 | 在查询时使用筛选器上下文进行评估 |
| 存储 | 存储表中每行的值(导入模式) | 从不将值存储在模型中 |
| 在视觉对象中使用 | 可以对数据进行筛选、分组或汇总(作为隐式度量值) | 专为汇总数据而设计 |
| 性能受影响 | 可能会增加内存使用量和模型大小 | 效率更高;在大型模型中性能更好 |
| 非常适合 | 用于切片或关系的新字段 | 基于筛选器的动态计算 |
了解这些差异有助于您根据建模和报告需求选择正确的方法。