跳至主要内容

Power BI RELATED DAX 函数:简介与使用场景

了解如何在 Power BI 中使用 RELATED DAX 函数,简化数据建模并构建有洞察力的报告。
· 9分钟 阅读

使用 AI 探索

数据建模是构建有洞察力的 Power BI 报告的基础。它使您能够定义清晰的表关系,并高效地组织、清洗与检索数据。在本教程中,您将了解 Power BI 中的 RELATED 函数。

通过动手示例,您将学习 RELATED 函数如何提升您的数据建模与报表编制能力。

如果您还是 Power BI 新手,可以先通过我们的 Power BI Fundamentals 技能路径熟悉相关主题。

您也可以下载 DAX 速查表,在学习更多 Power BI 与 DAX 时随手参考。

Power BI DAX Cheat Sheet

DataCamp DAX 速查表

RELATED 是一个 Power BI DAX 函数,可从相关表中的列提取值。关键在于,只有当当前表与目标列所在的表之间存在关系时,此函数才有效。

RELATED 函数通过允许您将不同表中的相关数据纳入模型,而无需手动合并或连接表,从而简化数据建模。

以下是 RELATED 函数的语法:

RELATED(ColumnToFetch)

举个简单的例子,假设您有一个销售(Sales)表和一个单独的产品(Products)表:

InvoiceID

ProductID

Quantity

Price

1000

123

2

21

1001

456

1

19.99

1002

123

3

31.5

1003

789

1

24.95

表 1. Sales(销售)

ProductID

ProductName

UnitPrice

123

Widget

10.5

456

Gear

19.99

789

Gizmo

24.95

表 2. Products(产品)

Sales 表记录销售交易,其中包含每笔销售的产品 ID,但不含产品名称或详细信息。Products 表包含与每个产品 ID 关联的名称与详细信息。

如果没有 RELATED,若要在 Sales 表内创建使用产品名称的计算列,您将不得不合并这两张表。

使用 RELATED,您可以在 Sales 表中创建一个新列,直接从 Products 表提取并显示每笔销售对应的产品名称。您也可以在度量值中使用 RELATED 来动态获取这些信息。

InvoiceID

ProductID

Quantity

Price

Product Name

1000

123

2

21

Widget

1001

456

1

19.99

Gear

1002

123

3

31.5

Widget

1003

789

1

24.95

Gizmo

表 3. 使用 RELATED

理解 Power BI 中的关系

在 Power BI 中,关系允许您基于公共列将表连接起来。这些关系是 Power BI 将多个来源的数据集成到数据模型中的基础,使之具备关系型数据库的处理方式。

Power BI 中的关系类型

Power BI 中可能存在的关系类型包括:

  • 一对一(1:1):一个表中的每一行仅与另一个表中的一行相关。这种关系较少见。
  • 一对多(1:many):一个表中的单行可与另一个表中的多行相关。这是 Power BI 中最常见的关系类型。
  • 多对多(many:many):一个表中的多行可与另一个表中的多行相互关联。由于可能带来复杂性与性能影响,使用多对多关系需谨慎。

RELATED 函数利用这些关系从相关表提取数据,并将其带入当前表的上下文。若没有正确定义的关系,RELATED 将无法工作。

关系为 RELATED 提供了清晰的导航路径,确保函数明确知道从何处提取数据。

良好的数据建模实践与清晰定义的关系可使 RELATED 高效访问相关数据。这意味着您可以避免复杂的查找操作,提升 Power BI 报告的性能与可用性。

现在我们来看看一些示例,了解 RELATED 在实践中的工作方式。

假设我们有一张包含每月产品销量的表,但没有产品名称或类别,只有 ProductID。我们还有一张 Products 表,包含 ProductID、ProductName 和 Category。我们使用 ProductID 在这两张表之间创建关系。

我们希望按产品类别分析销量。为此,我们在 Sales 表中创建一个计算列,使用以下 DAX 公式,然后可将其添加到 Power BI 报告的可视化中:

ProductCategory = RELATED(Products[ProductCategory])

RELATED 非常适合这种场景,因为 Products 与 Sales 之间存在直接的一对多关系,便于提取 ProductName 或 Category。

高级场景

RELATED 在需要将相关表的数据引入当前表上下文时尤其强大。

在度量值中使用 RELATED,可根据报表当前的筛选上下文执行动态计算。度量值用于聚合计算,并可通过 SUMX 等行上下文函数纳入相关数据。

如果您还不熟悉 SUMX 函数,可以参考这篇完整的 SUMX 教程。

让我们基于之前的示例探讨一个更复杂的版本。假设您有包含多个不同价格产品的表,以及按产品且每月变化的动态销售目标。您的目标是跟踪不同产品类别在每个月相对于这些目标的销售表现。

在包含 Sales 与 Products 表的数据模型中,我们现在还加入一张 SalesTargets 表,其中包含每个产品的月度销售目标,包括 ProductID、Month 和 TargetAmount 列。

为正确使用 RELATED,我们基于复合键在 Sales 与 SalesTargets 两张表中建立关系,该复合键由 Product ID 与 Month 的组合构成。

目标是计算每个产品类别在每个月完成销售目标的百分比。

Monthly Target Achievement =
VAR TotalSalesRevenue =
    SUMX(
        Sales,
        Sales[QuantitySold] * RELATED(Products[Price])
    )
VAR MonthlyTarget =
    SUMX(
        Sales,
        RELATED(SalesTargets[TargetAmount])
    )
RETURN
IF(
    MonthlyTarget > 0,
    TotalSalesRevenue / MonthlyTarget,
    BLANK()
)

该度量值通过遍历 Sales 表并使用 RELATED 获取每个产品的价格来计算 TotalSalesRevenue。随后,通过汇总 SalesTargets 表中相关月份和产品的目标金额来计算 MonthlyTarget。

最后,将总销售收入除以月度目标得到完成百分比,并确保仅在设定了目标时返回值(以避免被零除)。

您可以在 Financial Reporting in Power BI 技能路径中进一步学习财务数据分析,其中包含通过 Power BI 分析与可视化数据的动手示例。

既然我们已经熟悉了 RELATED 的工作方式,下面深入探讨一些最佳实践。

当您确实需要将其他表的数据纳入当前表上下文以进行计算时,再应用 RELATED。这对创建简化报表搭建的计算列尤其有用。

过度使用 RELATED 会导致数据模型不必要地复杂,并可能拖慢报表性能。如果可以直接通过可视化中的关系完成分析,而无需将数据实际引入您的表中,那通常更高效。

了解您的数据模型

在使用 RELATED 前,务必了解您的数据模型,尤其是表之间的关系。RELATED 需要一个已存在且处于活动状态的关系——通常是在“一对多”关系中,于“多”的一侧使用该函数从“一”的一侧拉取数据。

RELATED 不适用于多对多关系。

如果在未正确定义关系或误解关系方向性的情况下使用 RELATED,可能会导致错误或意外结果。

理解关系方向

使用 RELATED 将数据从主表(“一”侧)拉入相关表(“多”侧)。当您希望在计算或分析中包含来自其他表的查找数据时,这尤其有用。

在相反方向(从多到一)使用 RELATED 而缺乏恰当理解,可能造成困惑。对于反向方向,RELATEDTABLE 可能更合适,但它返回的是一张表,因此需要进一步的聚合函数。

当 RELATED 无法满足您在 Power BI 中的需求时,您可以考虑一些替代方法。这里介绍两种替代方案:LOOKUPVALUE 函数与使用 Power Query 合并数据。

LOOKUPVALUE

LOOKUPVALUE 功能非常灵活,但可能比 RELATED 更慢。这是因为它会逐行在表中查找匹配项。在我们的示例中,可能成千上万甚至上百万的销售交易会显著拖慢报表性能。

在存在直接关系且需求简单的情况下,LOOKUPVALUE 可能显得过于复杂。不过,如果您需要更复杂的匹配条件、尚未建立关系,或对性能不敏感,LOOKUPVALUE 提供了更高的灵活性。

若想了解更多,可阅读这篇 DAX LOOKUPVALUE 全面指南。

使用 Power Query 合并数据

在 Power Query 中合并表,本质上是在合并时创建数据的静态快照。

但如果您的 Products 表经常更新(新增产品或更改类别),那么在未同时刷新 Products 与 Sales 两张表的情况下,您在 Power Query 中合并得到的表将不会自动反映这些更新。

合并后的表可能变得非常庞大,并可能拖慢报表性能,尤其是在您只需相关表中的一小部分数据(例如产品类别)时。

结论

RELATED 函数可根据关系从关联表提取数据,简化数据建模,免去手动合并的需要。这样,您便可创建动态纳入其他表数据的计算列与度量值。

为达到最佳效果,请战略性地使用 RELATED,仅在必要时将数据引入当前表上下文。清晰理解数据模型与既定关系至关重要。

如果您希望继续学习 Power BI,可参考以下资源:

FAQs

RELATED 函数能否与非活动关系一起使用?

不可以。RELATED 函数无法直接利用处于非活动状态的关系。RELATED 旨在与表之间的活动关系配合使用。

在 Power BI 模型中,两个表之间可以存在多条关系,但任一时刻仅能有一条处于活动状态。RELATED 函数会自动使用这条活动关系。

RELATED 函数能否用于度量值和计算列?

RELATED 通常用于计算列,但也可以用于度量值,尤其是在诸如 SUMX 之类的迭代函数中,本教程已作演示。

当用于度量值时,RELATED 会基于迭代函数建立的当前行上下文,从相关表获取数据。这使得度量值能够在其筛选上下文内跨相关表进行动态计算。

RELATED 函数能否跨多张表的关系链使用?

可以。只要链路中的每一环都正确建立了关系,RELATED 就能跨多张表沿着关系链进行遍历。这使 RELATED 能够通过中间表从复杂数据模型中提取数据。

筛选上下文如何影响 RELATED 在度量值中的使用?

当在度量值中使用时,RELATED 在既定的筛选上下文内运行,而筛选上下文可由切片器、可视化或 CALCULATE 等其他 DAX 函数修改。

RELATED 提取的值会反映当前的筛选上下文,因此具有动态性,能对报表中的变化做出响应。这使得与用户交互相适应的情境化计算成为可能。

主题