PowerBI 总是将一对多关系更改为多对一关系
One-to-many relationship always changed into many-to-one by PowerBI
我在 PowerBI 中有两个来自 Azure SQL 的 tables,使用直接查询:
EMP(empID PK)
contactInfo(contactID PK, empID FK, contactDetail)
从EMP.empID
到contactInfo.empID
有明显的一对多关系。外键约束已成功实施。
但是我只能在 PowerBI 中创建多对一关系(contactInfo.empID
到 EMP.empID
)。如果我尝试相反的方法,PowerBI 总是会自动将关系转换为多对一(通过交换 from 和 to 列),这会阻止我创建视觉效果。 PowerBI 认为这两者是等价的吗?
更新:
我正在做的是在 PowerBI 中创建一个 table 来显示这两个 table 的连接结果。外键约束是contactInfo.empID REFERENCES EMP.empID
,是多对一的。我想这应该不是问题,因为我可以使用 SQL.
直接查询连接
还请建议我是否应该在相反的方向创建外键。
有关创建视觉对象失败的详细信息
确切的错误信息是:
Can't display the data because Power BI can't determine
the relationship between two or more fields.
Version: 2.43.4647.541 (PBIDesktop)
重现错误:
数据库架构如下:
我想要的是 PowerBI 中的 table 显示员工的联系方式和销售信息,即加入所有四个 table。当 table 视觉对象的 VALUES 包含 "empName, contactDetail, contactType, productName" 时会发生错误,但是,如果我只包含 "empName, contactDetail, contactType" 或 "empName, productName",则不会发生错误。一开始以为问题可能出在contactInfo和emp的关系上,现在看来更复杂了。我猜可能是多个一对多关系引起的?
展开我的评论做回答:
问题根源
在您的数据模型中,单个员工可以有多个联系人和多个销售人员。但是,Power BI 无法知道哪个 contactDetail 对应于哪个 productName,反之亦然(它需要知道它们才能一起显示在 table) 中。
更深入的解释
假设您有 1 emp 行,连接到 sales table 中的 10 行和 13 行在 contactInfo table 中。在 SQL 中,如果您从 emp 行开始并外连接到其他 2 tables,您将返回 (1*10)*( 1*13)行(共130行)。 contactInfo table 中的每一行都与 sales table 中的每一行重复。
如果您执行诸如对销售额求和之类的操作并且没有意识到单个销售记录重复了 13 次,那么重复可能会成为一个问题,否则可能没问题(例如,如果您只想要一个销售额列表和所有相关联的联系人)。
Power BI 对比 SQL
Power BI 的工作方式略有不同。 Power BI 的主要设计目的是汇总数字,然后按不同的属性对其进行分解。例如。按产品销售。联系方式销售。按天销售。为了做到这一点,Power BI 需要 100% 知道如何在 table 上的属性之间划分数字。
此时,我会注意到您的数据库图表不包含您使用 Power BI 聚合的任何明显指标。但是,Power BI 并不知道这一点。无论您是否有要聚合的指标,它的行为都是一样的。 (如果没有其他方法,Power BI 总是可以计算你的行数来制定一个指标。)
假设您的 销售额 table 有一个名为 Amt Sold 的指标。如果您引入 empName、productName 和 Amt Sold 列,Power BI 将确切地知道如何在 empName 和 ProductName 之间分配 Amt Sold。没问题。
现在添加 contactDetail。使用您的数据库图表,Power BI 无法知道 销售额 table 中的 Amt Sold 指标如何与给定的 联系方式。它可能知道 $100 属于 empID 27。并且 empID 27 对应于 contactInfo[=81= 中的 3 条记录] table。但它无法知道如何在这 3 个联系人之间分配 100 美元。
在 SQL 中,您将获得 3 个联系人,每个联系人显示 100 美元的销售金额。但在 Power BI 中,这意味着售出了 300 美元,但事实并非如此。即使平分 100 美元也会产生误导。如果 100 美元完全属于 1 个联系人怎么办?因此,Power BI 会显示您看到的错误。
我的推荐
- 如果可以,我建议您在引入之前更改您的数据模型。Power BI 最适合单一事实 table,其中包含您的指标(如销售量)。然后,您可以将此事实 table 加入任意数量的查找 table(例如客户、产品等),直接。这使您可以使用来自任何查找 table 的属性的任意组合对指标进行切片和切块。我建议查看星型模式数据模型和查找概念 tables: powerpivotpro.com/2016/02/data-modeling-power-pivot-power-bi
- 最起码,你会想要扁平化你的 tables(即合并 contactInfo 和 sales tables 到单个 table,然后再将它们导入您的数据模型。
- Power BI 可能不是您要完成的任务的最佳工具。如果您只想要 table 显示员工的所有销售和联系信息,而没有任何相关指标,则常规报告工具 + SQL 查询可能是更好的选择。
旁注:您无法通过反转 many:one 关系来克服此错误。 emp table 包含一行每个 empID。 contactInfo 和 sales table都包含多个具有相同 empID 的行。 这意味着 emp table 必然是与这两个table 关系的"one" 端。你不能随意改变它。
我在 PowerBI 中有两个来自 Azure SQL 的 tables,使用直接查询:
EMP(empID PK)
contactInfo(contactID PK, empID FK, contactDetail)
从EMP.empID
到contactInfo.empID
有明显的一对多关系。外键约束已成功实施。
但是我只能在 PowerBI 中创建多对一关系(contactInfo.empID
到 EMP.empID
)。如果我尝试相反的方法,PowerBI 总是会自动将关系转换为多对一(通过交换 from 和 to 列),这会阻止我创建视觉效果。 PowerBI 认为这两者是等价的吗?
更新:
我正在做的是在 PowerBI 中创建一个 table 来显示这两个 table 的连接结果。外键约束是contactInfo.empID REFERENCES EMP.empID
,是多对一的。我想这应该不是问题,因为我可以使用 SQL.
还请建议我是否应该在相反的方向创建外键。
有关创建视觉对象失败的详细信息
确切的错误信息是:
Can't display the data because Power BI can't determine
the relationship between two or more fields.
Version: 2.43.4647.541 (PBIDesktop)
重现错误:
数据库架构如下:
我想要的是 PowerBI 中的 table 显示员工的联系方式和销售信息,即加入所有四个 table。当 table 视觉对象的 VALUES 包含 "empName, contactDetail, contactType, productName" 时会发生错误,但是,如果我只包含 "empName, contactDetail, contactType" 或 "empName, productName",则不会发生错误。一开始以为问题可能出在contactInfo和emp的关系上,现在看来更复杂了。我猜可能是多个一对多关系引起的?
展开我的评论做回答:
问题根源
在您的数据模型中,单个员工可以有多个联系人和多个销售人员。但是,Power BI 无法知道哪个 contactDetail 对应于哪个 productName,反之亦然(它需要知道它们才能一起显示在 table) 中。
更深入的解释
假设您有 1 emp 行,连接到 sales table 中的 10 行和 13 行在 contactInfo table 中。在 SQL 中,如果您从 emp 行开始并外连接到其他 2 tables,您将返回 (1*10)*( 1*13)行(共130行)。 contactInfo table 中的每一行都与 sales table 中的每一行重复。
如果您执行诸如对销售额求和之类的操作并且没有意识到单个销售记录重复了 13 次,那么重复可能会成为一个问题,否则可能没问题(例如,如果您只想要一个销售额列表和所有相关联的联系人)。
Power BI 对比 SQL
Power BI 的工作方式略有不同。 Power BI 的主要设计目的是汇总数字,然后按不同的属性对其进行分解。例如。按产品销售。联系方式销售。按天销售。为了做到这一点,Power BI 需要 100% 知道如何在 table 上的属性之间划分数字。
此时,我会注意到您的数据库图表不包含您使用 Power BI 聚合的任何明显指标。但是,Power BI 并不知道这一点。无论您是否有要聚合的指标,它的行为都是一样的。 (如果没有其他方法,Power BI 总是可以计算你的行数来制定一个指标。)
假设您的 销售额 table 有一个名为 Amt Sold 的指标。如果您引入 empName、productName 和 Amt Sold 列,Power BI 将确切地知道如何在 empName 和 ProductName 之间分配 Amt Sold。没问题。
现在添加 contactDetail。使用您的数据库图表,Power BI 无法知道 销售额 table 中的 Amt Sold 指标如何与给定的 联系方式。它可能知道 $100 属于 empID 27。并且 empID 27 对应于 contactInfo[=81= 中的 3 条记录] table。但它无法知道如何在这 3 个联系人之间分配 100 美元。
在 SQL 中,您将获得 3 个联系人,每个联系人显示 100 美元的销售金额。但在 Power BI 中,这意味着售出了 300 美元,但事实并非如此。即使平分 100 美元也会产生误导。如果 100 美元完全属于 1 个联系人怎么办?因此,Power BI 会显示您看到的错误。
我的推荐
- 如果可以,我建议您在引入之前更改您的数据模型。Power BI 最适合单一事实 table,其中包含您的指标(如销售量)。然后,您可以将此事实 table 加入任意数量的查找 table(例如客户、产品等),直接。这使您可以使用来自任何查找 table 的属性的任意组合对指标进行切片和切块。我建议查看星型模式数据模型和查找概念 tables: powerpivotpro.com/2016/02/data-modeling-power-pivot-power-bi
- 最起码,你会想要扁平化你的 tables(即合并 contactInfo 和 sales tables 到单个 table,然后再将它们导入您的数据模型。
- Power BI 可能不是您要完成的任务的最佳工具。如果您只想要 table 显示员工的所有销售和联系信息,而没有任何相关指标,则常规报告工具 + SQL 查询可能是更好的选择。
旁注:您无法通过反转 many:one 关系来克服此错误。 emp table 包含一行每个 empID。 contactInfo 和 sales table都包含多个具有相同 empID 的行。 这意味着 emp table 必然是与这两个table 关系的"one" 端。你不能随意改变它。