创建计算列
有时,您需要的列数超过数据中存在的列数。 理想情况下,应将这些列直接添加到数据源,这样可以更轻松地维护,并允许在其他模型或报表中重用列逻辑。 但是,如果您需要在 Power BI 中连接到数据后添加列,您可以在 Power Query 编辑器中创建自定义列,或将计算列添加到语义模型。 从报表用户的角度来看,无论如何添加列,结果都相同。
一般来说,优先选择 Power Query 中的自定义列,因为它们以更紧凑、更优化的方式加载到模型中。 仅当将列添加到计算表或当公式执行以下操作时才建议计算列:
- 依赖于汇总的模型数据。
- 需要仅在 DAX 中可用的专用建模函数(例如
RELATED、RELATEDTABLE)或适用于父子层次结构的函数。
创建计算列
DAX 公式可用于将计算列 添加到模型中的任何表。 公式必须为每行返回一个值(标量)。
导入模型中的计算列会增加存储大小,并且会延长数据刷新时间,尤其是当它们依赖于刷新的其他表时。 因此,要谨慎使用过多的计算列,并考虑是否可以改用度量值。
在以下示例中,创建了多个计算列来支持财务分析,以证明计算列的通用性。
会计年度
此列可确定每个日期的会计年度。 会计年度从 7 月开始,因此从 7 月到 12 月的日期将分配到下一个日历年。 该公式将“FY”与年份连接在一起,对于下半年的日期,年份将增加 1。
Due Fiscal Year =
"FY"
& YEAR('Due Date'[Due Date])
+ IF(
MONTH('Due Date'[Due Date]) > 6,
1
)
以下步骤介绍 Microsoft Power BI 如何对计算列公式进行求值:
- 在文本串联运算符 (&) 之前计算加号 (+)。
-
YEAR函数返回截止日期年份的整数值。 - 当截止日期月数为 7-12(7 月至 12 月)时,
IF函数将返回值;否则,它将返回 BLANK。 (例如,Adventure Works 的财政年度为 7 月 - 6 月,因此,日历年的最后六个月将使用下一个日历年作为其财政年度。) - 年份值将添加到
IF函数返回的值(值为 1 或 BLANK)。 如果值为 BLANK,则会隐式转换为零 (0),以允许增加以生成会计年度值。 - 文本值
"FY"与隐式转换为文本的会计年度值连接在一起。
会计季度
此列根据会计年度结构为每个日期分配会计季度,其中第 1 季度为 7 月至 9 月。 公式将 Q 和季度编号追加到会计年度标签。
Due Fiscal Quarter =
'Due Date'[Due Fiscal Year] & " Q"
& IF(
MONTH('Due Date'[Due Date]) <= 3,
3,
IF(
MONTH('Due Date'[Due Date]) <= 6,
4,
IF(
MONTH('Due Date'[Due Date]) <= 9,
1,
2
)
)
)
月份键
MonthKey 公式将截止日期年份乘以值 100,然后加上截止日期的月数。 它生成一个数值,该数值可用于按时间顺序对 Due Month 文本值进行排序。
MonthKey =
(YEAR('Due Date'[Due Date]) * 100) + MONTH('Due Date'[Due Date])
完整日期标签
FORMAT 函数使用格式字符串将 Due Date 列值转换为文本。 在本例中,格式字符串将生成一个标签,用于描述年份、缩写月份名称和日:
Due Full Date =
FORMAT('Due Date'[Due Date], "yyyy mmm, dd")
注意
存在许多用户定义的日期/时间格式。 有关详细信息,请参阅 FORMAT 函数的自定义日期和时间格式。
添加这些内容后,Due Date 表包含六列:原始日期列和五个计算列。 这些列同时支持报表使用者的时间智能函数和可读性。
了解行上下文
Power BI 对表中每一行的计算列公式进行求值,这称为行上下文。 行上下文仅表示“当前行”。 例如,下面是 Due Fiscal Year 计算列:
Due Fiscal Year =
"FY"
& YEAR('Due Date'[Due Date])
+ IF(
MONTH('Due Date'[Due Date]) <= 6,
1
)
当 Power BI 运行此公式时,'Due Date'[Due Date] 会给出当前行中的值。 如果您使用过 Excel 表,可能会对此想法感到熟悉。
行上下文仅适用于当前表。 如果您需要另一个表中的值,则有两个主要选项:
- 如果两个表之间存在关系,请使用
RELATED或RELATEDTABLE函数。RELATED从关系的一端获取值。RELATEDTABLE从多端获取值表。 - 如果不存在关系,请使用
LOOKUPVALUE函数。
尽可能尝试使用 RELATED。 它的工作速度通常比 LOOKUPVALUE 更快,因为 Power BI 存储和索引数据的方式。
示例如下。 此公式将 Discount Amount 列添加到 Sales 表:
Discount Amount =
(
Sales[Order Quantity]
* RELATED('Product'[List Price])
) - Sales[Sales Amount]
Power BI 针对 Sales 表中的每一行计算此公式。 它从当前行获取 Order Quantity 和 Sales Amount。 若要从 Product 表中获取 List Price,它使用 RELATED 函数查找每个销售的正确值。
当 Power BI 对计算列公式进行计算时,始终应用行上下文。 它还与迭代程序函数一起发挥作用,使您可以创建更高级的摘要。 您将在本模块的后面部分了解迭代程序函数。