创建计算列

已完成

有时,您需要的列数超过数据中存在的列数。 理想情况下,应将这些列直接添加到数据源,这样可以更轻松地维护,并允许在其他模型或报表中重用列逻辑。 但是,如果您需要在 Power BI 中连接到数据后添加列,您可以在 Power Query 编辑器中创建自定义列,或将计算列添加到语义模型。 从报表用户的角度来看,无论如何添加列,结果都相同。

一般来说,优先选择 Power Query 中的自定义列,因为它们以更紧凑、更优化的方式加载到模型中。 仅当将列添加到计算表或当公式执行以下操作时才建议计算列:

  • 依赖于汇总的模型数据。
  • 需要仅在 DAX 中可用的专用建模函数(例如 RELATEDRELATEDTABLE)或适用于父子层次结构的函数。

创建计算列

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 如何对计算列公式进行求值:

  1. 在文本串联运算符 (&) 之前计算加号 (+)。
  2. YEAR 函数返回截止日期年份的整数值。
  3. 当截止日期月数为 7-12(7 月至 12 月)时,IF 函数将返回值;否则,它将返回 BLANK。 (例如,Adventure Works 的财政年度为 7 月 - 6 月,因此,日历年的最后六个月将使用下一个日历年作为其财政年度。)
  4. 年份值将添加到 IF 函数返回的值(值为 1 或 BLANK)。 如果值为 BLANK,则会隐式转换为零 (0),以允许增加以生成会计年度值。
  5. 文本值 "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 表包含六列:原始日期列和五个计算列。 这些列同时支持报表使用者的时间智能函数和可读性。

屏幕截图显示“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 表,可能会对此想法感到熟悉。

行上下文仅适用于当前表。 如果您需要另一个表中的值,则有两个主要选项:

  • 如果两个表之间存在关系,请使用 RELATEDRELATEDTABLE 函数。 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 QuantitySales Amount。 若要从 Product 表中获取 List Price,它使用 RELATED 函数查找每个销售的正确值。

当 Power BI 对计算列公式进行计算时,始终应用行上下文。 它还与迭代程序函数一起发挥作用,使您可以创建更高级的摘要。 您将在本模块的后面部分了解迭代程序函数。