在 Power BI Desktop 中创建和管理关系

当你有多个表时,你很可能要使用所有这些表中的数据来执行一些分析。 为准确计算结果并在报表中显示正确信息,这些表之间的关系是必需的。 在大多数情况下,你无需执行任何操作。 自动检测功能可为你执行此操作。 但有时,你可能需要自行创建关系,或者需要对关系进行更改。 无论哪种方法,都有必要了解 Power BI Desktop 中的关系及其创建和编辑方式。

在加载期间自动检测

如果同时查询两个或多个表,则在加载数据时,Power BI Desktop 将尝试为你查找并创建关系。 关系选项“基数”、“交叉筛选方向”和“激活此关系”会自动设置 。 Power BI Desktop 查看表中你正在查询的列名,以确定是否存在任何潜在关系。 若存在,则将自动创建这些关系。 如果 Power BI Desktop 无法以高置信度确定存在匹配项,则不会创建关系。 但是,你仍可使用“管理关系”对话框来手动创建或编辑关系。

使用自动检测功能创建关系

在“建模”选项卡上,选择“管理角色”>“自动检测”。

Animation showing how to create a relationship with autodetect.

手动创建关系

  1. 在“建模”选项卡上,选择“管理角色”>“新建”。

  2. 在“创建关系”对话框第一个表的下拉列表中,选择一个表。 选择要在关系中使用的列。

  3. 在第二个表的下拉列表中,选择要在关系中使用的其他表。 选择要使用的其他列,然后选择“确定”。

    Animation showing how to create a manual relationship.

默认情况下,Power BI Desktop 为新关系自动配置“基数”(方向)、“交叉筛选方向”和“激活此关系”选项 。 但是,你可根据需要更改这些设置。 有关详细信息,请参阅了解其他选项

如果为该关系选择的表均不具有唯一值,则将看到以下错误:One of the columns must have unique values(其中一列必须具有唯一值)。 关系中至少有一个表必须具有密钥值的不同的唯一列表,该列表是对所有关系数据库技术的常见要求。

如果遇到此错误,可采用以下方式修复:

  • 使用“删除重复项”创建具有唯一值的列。 此方法的缺点是移除重复行时可能会丢失信息。 通常重复键(行)是有用的。
  • 将包含不同密钥值列表的中间表添加到模型,该模型会链接到关系中的两个原始列。

有关详细信息,请参阅此 博客文章

或者,在“模型视图”关系图布局中,可以将列从一个表拖放到另一个表中的列,以创建关系。

编辑关系

可通过两种方式在 Power BI 中编辑关系。

编辑关系的第一种方法是在“模型视图”中使用“在属性中编辑关系”窗格,可在其中选择两个表之间的任意行,以查看“属性”窗格中的关系选项。 请务必展开“属性”窗格以查看关系选项。

Screenshot of adjusting relationships in the properties pane.

还可以在“属性”窗格中查看编辑关系的视频演示

编辑关系的另一种方法是使用“关系编辑器”对话框,可以从 Power BI Desktop 中以多种方式打开该对话框。 以下列表显示了打开“关系编辑器”对话框的不同方式:

从“报表视图”中执行以下任意操作:

  • 选择“建模”功能区>“管理关系”,然后选择该关系并选择“编辑”。
  • 在“字段”列表中选择一个表,然后选择“表工具”功能区>“管理关系”,然后选择该关系并选择“编辑”。

在“数据”视图中选择“表工具”功能区 >“管理关系”,然后选择该关系并选择“编辑”。

在“模型”视图中执行以下任意操作:

  • 选择“主页”功能区 >“管理关系”,然后选择该关系并选择“编辑”。
  • 双击两个表之间的任意行。
  • 右键单击两个表之间的任意行,然后选择“属性”。
  • 在两个表之间选择任意行,然后在“属性”窗格中选择“打开关系编辑器”。

最后,还可以从任何视图中编辑关系,右键单击或选择省略号以转到任何表的上下文菜单,然后选择“管理关系”,选择该关系并选择“编辑”

下图显示“编辑关系”窗口的屏幕截图。

Screenshot of the edit relationship window.

使用不同方法编辑关系

使用“编辑关系”对话框是在 Power BI 中编辑关系的更具引导性的体验,目前处于预览状态。 可以在每个表中查看数据预览。 选择不同列时,窗口会自动验证关系并提供适当的基数和交叉筛选选择。

在“属性”窗格中编辑关系是在 Power BI 中编辑关系的简化方法。 你只会看到可从中选择的表名和列,而不显示数据预览,并且只有在选择“应用更改”时才会验证所做的关系选择。 使用“属性”窗格及其简化方法可减少编辑关系时生成的查询数,这对于大数据方案非常重要,尤其是在使用 DirectQuery 连接时。 使用“属性”窗格创建的关系也比“编辑关系”对话框中允许创建的关系更高级。

还可在“模型”视图关系图布局中选择多个关系,通过按 Ctrl 键并选择多行即可选择多个关系。 可以在“属性”窗格中编辑通用属性,“应用更改”将处理一个事务中的更改。

也可以通过按键盘上的 Delete 键来删除单个或多个选定的关系。 无法撤消删除操作,因此对话框会提示你确认删除关系。

重要

在“属性”窗格中编辑关系的功能目前处于预览状态。 在预览版期间,功能和文档可能会更改。 必须在 Power BI Desktop 中启用此功能,方法是转到“文件”>“选项和设置”>“选项”>“预览功能”,然后在“全局”部分中,选中“关系”窗格旁边的复选框。

配置更多选项

创建或编辑关系时,可配置更多选项。 默认情况下,Power BI Desktop 会根据最佳推测自动配置更多选项,但每个关系的配置可能会根据列中的数据有所不同。

基数

“基数”选项可以具有以下设置之一:

多对一 (*:1):多对一关系是最常见的默认关系类型。 这意味着一个给定表中的列可具有一个值的多个实例,而另一个相关表(通常称为查找表)仅具有一个值的一个实例。

一对一(1:1) :在一对一关系中,一个表中的列仅具有特定值的一个实例,而另一个相关表也是如此。

一对多(1:*) :在一对多关系中,一个表中的列仅具有特定值的一个实例,而另一个相关表可具有一个值的多个实例。

多对多 (*:*):借助复合模型,可以在表之间建立多对多关系,从而消除了表中对唯一值的要求。 它还删除了旧解决办法,如为建立关系而仅引入新表。 有关详细信息,请参阅具有多对多基数的关系

有关何时更改基数的详细信息,请参阅了解其他选项

交叉筛选器方向

“交叉筛选方向”选项可以具有以下设置之一:

双向:出于筛选目的,两个表被视为如同一个表。 “双向”设置非常适用于其周围具有多个查找表的单个表。 例如,具有部门查找表的实际销售额表。 此配置通常称为星型架构配置(一个具有多个查找表的中心表)。 但是,如果你拥有两个或多个具有查找表(部分查找表共有)的表,则“双向”设置不适合。 继续讲之前的示例,在本例中你还一个预算销售表,它记录了每个部门的目标预算。 并且,部门表格同时连接到标售表和预算表。 对于此类配置,请避免“双向”设置。

单向:最常用的默认方向,这意味着连接表中的筛选选项适用于将求值总和的表。 如果你在 Excel 2013 或更早的数据模型中导入了 Power Pivot,则所有关系都将具有单个方向。

有关何时更改交叉筛选方向的详细信息,请参阅了解其他选项

激活此关系

勾选后,关系会用作处于活动状态的默认关系。 如果两个表格之间存在多个关系,则 Power BI Desktop 可通过活动关系自动创建包含这两个表的可视化效果。

有关何时激活特定关系的详细信息,请参阅了解其他选项

了解关系

使用关系将两个表连接在一起后,就可以像处理单个表一样处理两个表中的数据。 然后,就无需担心关系细节或在导入这些表之前将它们平展为单个表。 在许多情况下,Power BI Desktop 可自动为你创建关系。 但如果 Power BI Desktop 无法以高置信度确定两个表之间存在关系,则不会自动创建关系。 在这种情况下,必须执行此操作。

我们来快速演示一下,以更好地向你展示关系如何在 Power BI Desktop 进行操作。

提示

你可自行完成此课程:

  1. 将以下“ProjectHours”表复制到 Excel 工作表中(标题除外),选择所有单元格,然后选择“插入”>“表”
  2. 在“创建表”对话框中,选择“确定” 。
  3. 选择任何表单元格,然后选择“表设计”>“表名称”,并输入“ProjectHours”
  4. 对“CompanyProject”表执行相同的操作。
  5. 使用 Power BI Desktop 中的“获取数据”导入数据。 选择两个表作为数据源,然后选择“加载”。

第一个表“ProjectHours”是记录某位员工在特定项目上工作的小时数的工作单记录。

ProjectHours

工作单 提交者 小时数 项目 提交日期
1001 Brewer, Alan 22 蓝色 2013/1/1
1002 Brewer, Alan 26 红色 2013/2/1
1003 Ito, Shu 34 黄色 2012/12/4
1004 Brewer, Alan 13 橙色 2012/1/2
1005 Bowen, Eli 29 紫色 2013/10/1
1006 Bento, Nuno 35 绿色 2013/2/1
1007 Hamilton, David 10 黄色 2013/10/1
1008 Han, Mu 28 橙色 2012/1/2
1009 Ito, Shu 22 紫色 2013/2/1
1010 Bowen, Eli 28 绿色 2013/10/1
1011 Bowen, Eli 9 蓝色 2013/10/15

第二个表“CompanyProject”列举具有所分配优先级的项目:A、B 或 C。

CompanyProject

项目名称 优先级
蓝色 A
红色 B
绿色 C
黄色 C
紫色 B
橙色 C

请注意,每个表都具有一个项目列。 每个列的命名略有不同,但其值看起来相同。 这个区别很重要,我们很快将回到这一点。

我们向一个模型导入了两个表,接下来创建报表。 首先,我们要获取的是按项目优先级提交的小时数,因此选择“字段”窗格中的“Priority”和“Hours” 。

Screenshot of the Priority and Hours fields selected from the Fields pane.

如果在报表画布中查看表,你会看到每个项目的小时数均为“256”,这也是总数。 显然,此数字不正确。 为什么? 这是因为如果这两个表之间不存在关系,则不能由一个表中的值(“CompanyProject”表中的“Priority”)切分另一个表中的值(“Project”表中的“Hours”)来计算后者值的总数 。

因此,让我们在这两个表之间创建一个关系。

还记得两个表中具有项目名称但其值看似相似的那些列吗? 我们将使用这两列来创建表之间的关系。

为什么是这些列? 嗯,如果查看“ProjectHours”中的“Project”列,可看到蓝色、红色、黄色、橙色等 。 事实上,显示了多个具有相同值的行。 “Project”实际上具有多个颜色值。

如果查看“CompanyProject”表中的“ProjName”列,可看到每个项目名称仅具有一个颜色值 。 这个表中的每个颜色值都是唯一的,这一点很重要,因为我们可在这两个表之间创建关系。 此情况下,可创建多对一的关系。 在多对一的关系中,一个表中至少有一个列必须包含唯一值。 对于一些关系,还有更多选项,我们将在后面讨论。 现在,让我们为两个表各自的“Project”列创建关系。

若要创建新关系

  1. 从“建模”选项卡选择“管理关系”。

  2. 在“管理关系”中,选择“新建”以打开“创建关系”对话框,可在其中选择表、列以及要用于关系的任何其他设置。

  3. 在第一个下拉列表中,选择“ProjectHours”作为第一个表,然后选择“Project”列 。 此方是关系中的多方

  4. 在第二个下拉列表中,“CompanyProject”已被预先选择为第二个表。 选择“ProjName”列。 此方是关系中的单方

  5. 接受关系选项的默认设置,然后选择“确定”。

    Screenshot of the Create relationship dialog box.

  6. 在“管理关系”对话框中,选择“关闭” 。

为了完全展示,只需以复杂的方式创建这一关系。 其实选择“管理关系”对话框中的“自动检测”即可。 事实上,如果两个列的名称相同,则在加载数据时,自动检测功能会自动为你创建关系。

现在,我们再来看一下报表画布中的表。

Screenshot of the Priority and Hours fields selected from the Fields pane with new relationship.

这看起来好得多,不是吗?

按“Priority”汇总小时数时,Power BI Desktop 会查询“CompanyProject”查找表中唯一颜色值的每个实例,然后查询“ProjectHours”表中这些值的每个实例,最后计算每个唯一值的总和 。

借助自动检测功能,可能甚至无需执行此操作。

了解其他选项

使用自动检测功能或手动创建关系时,Power BI Desktop 会基于表中的数据自动配置其他选项。 这些其他关系选项位于“创建关系”和“编辑关系”对话框的底部 。

Screenshot of the lower portion of the Create relationship dialog box showing Cardinality and Cross filter direction options.

Power BI 通常自动设置这些选项,你无需调整它们。 但在一些情况下,最好自己配置这些选项。

自动关系更新

可以管理 Power BI 如何处理和自动调整报表和模型中的关系。 若要指定 Power BI 处理关系选项的方式,请在 Power BI Desktop 中选择“文件”>“选项和设置”>“选项”,然后在左侧窗格中选择“数据加载” 。 此时系统会显示“关系”的选项。

Screenshot of the Options box showing the Relationships settings in the Data Load tab.

可选择和启用三个选项:

  • 在第一次加载时从数据源导入关系:默认情况下选择此选项。 选中后,Power BI 会检查数据源中定义的关系,例如数据仓库中的外键/主键关系。 如果存在这种关系,那么在最初加载数据时,会将它们镜像复制到 Power BI 数据模型。 利用此选项,可以快速开始使用模型,而无需自行查找或定义这些关系。

  • 在刷新数据时更新或删除关系:默认情况下不选择此选项。 如果选中,则 Power BI 会在刷新语义模型时检查数据源关系中的更改。 如果更改或删除这些关系,Power BI 会在其自己的数据模型中镜像这些更改,进行更新或删除以使其匹配。

    警告

    如果使用依赖于已定义关系的行级别安全性,我们建议不要选择此选项。 如果删除 RLS 设置所依赖的关系,则模型的安全性可能会降低。

  • 加载数据后自动检测新关系在加载期间自动检测中介绍了此选项。

将来更新数据需要其他基数

通常,Power BI Desktop 可自动确定用于关系的最佳基数。 如果由于知道数据将在未来更改,而确实需要替代自动设置,则可在“基数”控件中对其进行更改。 我们来看一个需要选择其他基数的示例。

“CompanyProjectPriority”表列出了所有公司项目及其优先级。 而“ProjectBudget”表是一组其预算已获批准的项目。

CompanyProjectPriority

项目名称 优先级
蓝色 A
红色 B
绿色 C
黄色 C
紫色 B
橙色 C

ProjectBudget

已批准的项目 预算分配 分配日期
蓝色 40,000 2012/12/1
红色 100,000 2012/12/1
绿色 50,000 2012/12/1

如果我们在“ProjectBudget”表的“Approved Projects”列和“CompanyProjectPriority”表的“ProjectName”列之间创建关系,则 Power BI 会自动将“基数”设置为“一对一(1:1)”,并将“交叉筛选方向”设置为“双向” 。

Screenshot of the Create relationship dialog box with Cardinality to One to one (1:1) and Cross filter direction to Both.

Power BI 进行这些设置的原因在于,对于 Power BI Desktop 而言,两个表的最佳组合如下所示:

项目名称 优先级 预算分配 分配日期
蓝色 A 40,000 2012/12/1
红色 B 100,000 2012/12/1
绿色 C 50,000 2012/12/1
黄色 C

紫色 B

橙色 C

这两个表之间存在一对一的关系,原因是组合表的“ProjName”列中没有重复值。 “ProjName”列是唯一的,因为每个值仅出现一次;因此,这两个表中的行可直接合并而无任何重复项。

但是,假设你知道在下次刷新数据时,此数据会进行更改。 对于蓝色和红色项目,刷新后的“ProjectBudget”表现在具有其他行:

ProjectBudget

已批准的项目 预算分配 分配日期
蓝色 40,000 2012/12/1
红色 100,000 2012/12/1
绿色 50,000 2012/12/1
蓝色 80,000 2013/6/1
红色 90,000 2013/6/1

这些其他行意味着两个表的最佳组合现在如下所示:

项目名称 优先级 预算分配 分配日期
蓝色 A 40,000 2012/12/1
红色 B 100,000 2012/12/1
绿色 C 50,000 2012/12/1
黄色 C

紫色 B

橙色 C

蓝色 A 80000 2013/6/1
红色 B 90000 2013/6/1

在这一新的组合表中,“ProjName”列具有重复值。 刷新表格后,两个原始表将不再具有一对一的关系。 在此情况下,由于我们知道将来的这些更新将导致“ProjName”列出现重复项,我们想要将“基数”设置为“多对一(*:1)”,其中多方位于“ProjectBudget”上,而单方位于“CompanyProjectPriority”上。

为一组复杂的表和关系调整交叉筛选方向

对于大多数关系,交叉筛选方向设置为“双向”。 但在一些更少见的情况下,可能需要将此选项设置为与默认值不同的值。 举个例子,如果从旧版 Power Pivot 导入模型,其中每个关系都设置为单向。

通过“双向”设置,Power BI Desktop 可将连接表的所有方面均视为如同是一个表。 然而在某些情况下,Power BI Desktop 无法将关系的交叉筛选方向设置为“双向”,同时还会保留一组可用于报表且语义不明的默认值。 如果关系的交叉筛选方向未设置为“双向”,这通常是因为它会造成多义性。 如果默认的交叉筛选设置不适用于你,请尝试将其设置为特定表或“双向”。

单向交叉筛选适用于很多情况。 事实上,如果你在 Excel 2013 或更早版本中导入 Power Pivot 中的模型,则所有关系均将设置为单向。 单向是指连接表中的筛选选项适用于将进行聚合操作的表格。 有时,交叉筛选可能有点难以理解,因此我们来看一个示例。

使用单向交叉筛选时,如果你创建一个可汇总项目小时数的报表,则可选择按“CompanyProject”表及其“Priority”列或“CompanyEmployee”表及其“City”列进行汇总(或筛选) 。 但如果你想计算每个项目的员工数(不太常见的问题),则不适用。 你将获取完全相同的一列值。 在下面的示例中,两个关系的交叉筛选方向均设置为单向:指向“ProjectHours”表。 在“值”Well 中,“Project”字段设置为“Count” :

Screenshot of the visualization tab used with the Employee and Project fields.

筛选器规范将从“CompanyProject”流向“ProjectHours”(如下图所示),但不会抵达“CompanyEmployee” 。

Diagram of a cross filtering example with flow from CompanyProject to ProjectHours.

但若将交叉筛选方向设置为“双向”,则会起作用。 “双向”设置使筛选器规范可流到“CompanyEmployee” 。

Diagram of a cross filtering example with flow both ways

通过将交叉筛选方向设置为“双向”,报表现可正确显示:

Screenshot of cross filtering direction set to Both.

双向交叉筛选非常适合表格关系模式(例如前面显示的模式)。 此架构通常称为星型架构,如下所示:

Diagram of cross filtering both directions in star schema.

双向交叉筛选不太适合数据库中常有的更常规模式,比如以下关系图中的模式:

Diagram of cross filtering in both directions on a database pattern.

如果你具有与此类似的表格模式,则交叉筛选会创建一组语义不明的关系。 例如,如果你求取 TableX 中某个字段的总和,然后选择按 TableY 中的某个字段进行筛选,则不清楚筛选器应如何流动,是通过顶部表还是底部表进行流动。 这种模式的一个常见示例是 TableX 为具有实际销售额数据的销售表,而 TableY 具有预算数据, 则中间的表格是这两个表所用的查找表,如部门或地区。

和活动/非活动关系一样,如果会导致报表的多义性,则 Power BI Desktop 不允许将关系设置为“双向”。 可通过多种不同方式来处理这种情况。 以下为最常见的两种方式:

  • 删除关系或将其标记为“非活动”,以减少多义性。 然后,可能就能够将关系的交叉筛选设置为“双向”。
  • 导入表格两次(第二次使用其他名称)以消除循环。 这样做会产生类似于星型架构的关系模式。 借助星型架构,所有关系均可设置为“双向”。

错误的活动关系

Power BI Desktop 自动创建关系时,有时会在两个表之间遇到多个关系。 发生此情况时,仅其中一个关系会设置为“活动”。 活动关系用作默认关系,因此在从两个不同的表中选择字段时,Power BI Desktop 可自动为你创建可视化效果。 但在某些情况下,自动选定的关系可能是错误的。 使用“管理关系”对话框将关系设置为“活动”或“非活动”,或者可在“编辑关系”对话框中设置活动关系 。

为了确保存在默认关系,Power BI Desktop 仅允许两个表在给定时间存在单个活动关系。 因此,你必须先将当前关系设置为“非活动”,然后才能将想要的关系设置为“活动”。

我们来看一个示例。 第一个表是“ProjectTickets”,第二个表是“EmployeeRole” 。

ProjectTickets

工作单 开具者 提交者 小时数 项目 提交日期
1001 Perham, Tom Brewer, Alan 22 蓝色 2013/1/1
1002 Roman, Daniel Brewer, Alan 26 红色 2013/2/1
1003 Roth, Daniel Ito, Shu 34 黄色 2012/12/4
1004 Perham, Tom Brewer, Alan 13 橙色 2012/1/2
1005 Roman, Daniel Bowen, Eli 29 紫色 2013/10/1
1006 Roth, Daniel Bento, Nuno 35 绿色 2013/2/1
1007 Roth, Daniel Hamilton, David 10 黄色 2013/10/1
1008 Perham, Tom Han, Mu 28 橙色 2012/1/2
1009 Roman, Daniel Ito, Shu 22 紫色 2013/2/1
1010 Roth, Daniel Bowen, Eli 28 绿色 2013/10/1
1011 Perham, Tom Bowen, Eli 9 蓝色 2013/10/15

EmployeeRole

员工 角色
Bento, Nuno 项目经理
Bowen, Eli 项目主管
Brewer, Alan 项目经理
Hamilton, David 项目主管
Han, Mu 项目主管
Ito, Shu 项目主管
Perham, Tom 项目发起人
Roman, Daniel 项目发起人
Roth, Daniel 项目发起人

实际上,此处存在两个关系:

  • 在“EmployeeRole”表中的“Employee”和“ProjectTickets”表中的“SubmittedBy”之间 。
  • 在“ProjectTickets”表中的“OpenedBy”和“EmployeeRole”表中的“Employee”之间 。

Screenshot of a two-relationship example.

如果我们将两个关系都添加到模型中(首先是“OpenedBy”),则“管理关系”对话框将显示“OpenedBy”处于活动状态 :

Screenshot of a OpenedBy active in the Manage relationships dialog box.

现在,如果创建一个报表,且该报表在报表画布的表格可视化效果中使用“EmployeeRole”中的“Role”和“Employee”字段,以及“ProjectTickets”中的“Hours”字段,则只会显示项目发起人,因为他们是唯一开具项目单的人员 。

Screenshot shows the Employee, Role, and Hours fields selected.

我们可更改活动关系并获取“SubmittedBy”,而不是“OpenedBy” 。 在“管理关系”中,取消勾选“ProjectTickets(OpenedBy)”到“EmployeeRole(Employee)”的关系,然后勾选“EmployeeRole(Employee)”到“Project Tickets(SubmittedBy)”的关系 。

Screenshot of changing the active relationship in the Manage relationship dialog box.

在“关系”视图中查看所有关系

有时,模型具有多个表格,且各表格之间存在复杂关系。 Power BI Desktop 中的“关系”视图可显示模型中的所有关系及其方向和基数,是一种易于理解且可自定义的关系图。

若要了解详细信息,请参阅使用 Power BI Desktop 中的关系视图

故障排除

本部分提供在 Power BI 中处理关系时的指导和故障排除信息。

无法确定各字段之间的关系

Power BI 尝试通过从正在使用的模型推断关系来在视觉对象中显示相关数据。 有时这类推理并不明显,你可能会意外发现视觉对象中存在指示特定列之间没有关系的错误。

为了说明 Power BI 如何确定字段是否相关,让我们使用一个示例模型来说明下面几节中的几个场景。 下图显示了我们将在示例场景中使用的示例模型。

Screenshot of a sample model used in troubleshooting scenarios.

场景 1:传统的星型架构,不提供度量约束。 参考上图中的示例模型,让我们首先查看该图像的右半部分:“供应商 - 购买 - 产品”表。 此示例是一种传统星型架构,包含事实数据表(“购买”)和两个维度表(“产品”和“供应商”)。 维度表与事实数据表之间的关系是“一对多”(一个产品对应多个购买,一个供应商对应多个购买)。 对于这种类型的架构,我们可以回答如下问题:“产品 X 的销售额是多少?”、“供应商 Y 的销售额是多少?”以及“供应商 Y 销售哪些产品?”

如果想将“产品”和“供应商”相关联,可以通过查看“购买”表来判断是否存在具有相同产品和供应商的条目。 示例查询可能如以下示例所示:

Correlate Product[Color] with Vendor[Name] where CountRows(Purchases)>0

where CountRows(Purchases)>0 是 Power BI 将添加的一个隐式约束,以确保返回相关数据。 通过“购买”表进行此关联,可以返回在事实数据表中至少占一个条目的“产品-供应商”配对,这些配对从数据的角度来看是有意义的。 可以预见,将不会显示任何从未有过销售额(对分析没有用处)的“产品-供应商”的无意义组合。

场景 2:传统的星型架构,提供度量约束。 在场景 1 的前一个示例中,如果用户以汇总列(例如,购买数量的总和/平均数/计数)或模型度量值(VendID 的非重复计数)的形式提供约束,Power BI 可以生成以下示例形式的查询:

Correlate Product[Color] with Vendor[Name] where MeasureConstraint is not blank

在这种情况下,Power BI 会尝试返回对用户提供的约束具有有意义值(非空白)的组合。 Power BI 不需要添加自己的隐式约束“CountRows(Purchases)>0”,如在前面的场景 1 中所做的那样,因为用户提供的约束就足够了。

场景 3:非星型架构,不提供度量约束。 在这个场景中,我们将注意力集中在模型的中心,可以看到“销售额 - 产品 - 购买”表,其中有一个维度表(“产品”)和两个事实数据表(“销售额”和“购买”)。 由于这不是星型架构,因此我们无法回答场景 1 中同样的问题。 假设我们尝试将“购买”与“销售额”相关联;由于“购买”与“产品”为多对一关系,“产品”与“销售额”为一对多关系, 因此“销售”与“购买”间接为多对多关系。 我们可以将一个“产品”链接到多个“购买”,将一个“产品”链接到多个“销售额”,但不能将一个“销售额”链接到多个“购买”,反之亦然。 我们只能将多个“购买”链接到多个“销售额”。

在这种情况下,如果我们尝试在视觉对象中组合 Purchase[VenID] 和 Sales[CustID],由于这些表之间存在多对多关系,Power BI 没有可以应用的具体约束。 尽管可能存在可应用于各种场景的自定义约束(不一定源自模型中建立的关系),但 Power BI 无法仅根据关系推断默认约束。 如果 Power BI 尝试返回两个表的所有组合,它将创建一个大型交叉联接并返回不相关的数据。 相反,Power BI 会在视觉对象中引发一个错误,如下所示。

Screenshot of an error dialog when relationship can’t be inferred. Alternatively, Screenshot of an error dialog where relationship isn’t inferred.

场景 4:非星型架构,提供度量约束。 如果我们以场景 3 为例,以汇总列(例如 Count of Product[ProdID])或模型度量值 (Sales[Total Qty]) 的形式添加用户提供的约束,则 Power BI 可以以 Correlate Purchase[VenID] 和 Sales[CustID] 的形式生成查询,其中 MeasureConstraint 不为空

在这种情况下,Power BI 将用户的约束视为 Power BI 需要应用的唯一约束,并返回为其生成非空值的组合。 用户已将 Power BI 引导至所需的方案,Power BI 会应用该指南。

场景 5:提供度量约束但与列部分相关时。 在某些情况下,用户提供的度量约束并不完全与视觉对象中的所有列相关。 模型度量值始终将所有内容关联在一起。 Power BI 在尝试查找视觉对象中的列之间的关系时会将此场景视为黑匣子,并假定用户知道他们正在使用它执行哪些操作。 但是,从用户界面中选择的“总和”、“平均值”和类似汇总形式的汇总列可能仅与基于该列所属表的关系的视觉对象中使用的列/表的子集相关。 因此,约束适用于某些列配对,但并非适用于全部。 在这种情况下,Power BI 会尝试查找可以应用于与用户提供的约束无关的列的默认约束(如场景 1)。 如果 Power BI 找不到任何内容,则返回以下错误。

Screenshot of an error dialog when Power BI can’t find default constraints.

解决关系错误

看到“无法确定各字段之间的关系”错误时,可以执行以下步骤来尝试解决该错误:

  1. 检查模型。 是否针对你想通过分析回答的问题的类型进行了适当设置? 你能否更改表之间的某些关系? 能否避免创建间接的“多对多”关系?

    考虑将反向 V 形架构转换为两个表,并使用它们之间的直接“多对多”关系,如在 Power BI Desktop 中应用多对多关系中所述。

  2. 以汇总列或模型度量值的形式向视觉对象添加约束。

  3. 如果已添加汇总列,但仍出现错误,请考虑使用模型度量值。

有关模型和关系的详细信息,请参阅以下文章: