一对多关系总是被 PowerBI 变成多对一

Rya*_*yan 1 data-visualization foreign-keys relationship powerbi

我在 PowerBI 中有两个来自 Azure SQL 的表,使用直接查询:

  • EMP(empID PK)
  • contactInfo(contactID PK, empID FK, contactDetail)

EMP.empID到有明显的一对多关系contactInfo.empID。外键约束已成功实施。

但是,我只能在 PowerBI 中创建多对一关系 ( contactInfo.empIDto EMP.empID)。如果我尝试相反的方法,PowerBI 总是会自动将关系转换为多对一(通过交换 from 和 to 列),这会阻止我创建视觉效果。PowerBI 是否认为两者是等价的?

更新:

我所做的只是在 PowerBI 中创建一个表,显示这两个表的连接结果。外键约束是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)
Run Code Online (Sandbox Code Playgroud)

要重现错误:

数据库架构如下:

模式

我想要的是 PowerBI 中的一个表,显示员工的联系方式和销售信息,即加入所有四个表。当表视觉对象的 VALUES 包含“empName、contactDetail、contactType、productName”时会发生错误,但是,如果我只包含“empName、contactDetail、contactType”或“empName、productName”,则不会发生错误。起初我以为问题可能出在contactInfo和emp之间的关系上,但现在似乎更复杂了。我猜这可能是由多个一对多关系引起的?

Leo*_*ard 5

扩大我的评论以做出答案:

问题的根源

在您的数据模型中,一个员工可以有多个联系人和多个销售人员。但是,Power BI 无法知道哪个contactDetail对应于哪个productName,反之亦然(它需要知道将它们一起显示在表格中)。

更深入的解释

假设您有 1 个emp行,它连接到sales表中的 10 行和contactInfo表中的 13 行。在 SQL 中,如果您从emp行和外连接开始到其他 2 个表,您将返回 (1*10)*(1*13) 行(总共 130 行)。在每一行联络信息表重复在每一行的销售表。

如果您执行诸如对销售额求和之类的操作并且没有意识到单个销售记录重复了 13 次,那么这种重复可能是一个问题,否则可能没问题(例如,如果您只想要销售和所有相关联系人的列表)。

Power BI 与 SQL

Power BI 的工作方式略有不同。Power BI 主要用于聚合数字,然后按不同的属性将它们分解。例如按产品销售。联系方式销售。按天销售。为此,Power BI 需要 100% 知道如何在表上的属性之间划分数字。

在这一点上,我会注意到您的数据库图表不包含您使用 Power BI 聚合的任何明显指标。但是,Power BI 不知道这一点。无论您是否有要聚合的指标,它的行为都是相同的。(如果其他方法都失败了,Power BI 始终可以计算您的行数以制定指标。)

假设您的销售表中有一个名为Amt Sold 的指标。如果引入empNameproductNameAmt Sold列,Power BI 将确切知道如何在empNameProductName之间划分Amt Sold。这里没有问题。

现在添加contactDetail。使用您的数据库图表,Power BI 无法知道sales表中的Amt Sold指标如何与给定的contactDetail 相关。它可能知道 $100 属于empID 27。并且empID 27 对应于contactInfo表中的 3 条记录。但它无法知道如何在这 3 个联系人之间分配 100 美元。

在 SQL 中,您将得到 3 个联系人,每个联系人都显示 100 美元的销售金额。但在 Power BI 中,这意味着售出 300 美元,但事实并非如此。即使平均分配 100 美元也会产生误导。如果 100 美元完全属于 1 个联系人怎么办?因此,Power BI 会显示您看到的错误。

我的推荐

  1. 如果可以,我建议您在引入之前更改数据模型。Power BI 最适合使用单个事实表,其中包含您的指标(如销售量)。然后,加入这个事实表,以尽可能多的查找表,你喜欢(例如,客户,产品等),直接。这允许您使用任何查找表中的任意属性组合对您的指标进行切片和切块。我建议查看星型模式数据模型和查找表的概念:powerpivotpro.com/2016/02/data-modeling-power-pivot-power-bi
  2. 至少,您会想要展平您的表格(即将 contactInfosales表格合并到一个表格中,然后再将它们导入您的数据模型。
  3. Power BI 可能不是您要完成的任务的最佳工具。如果您想要的只是一个显示员工所有销售和联系信息的表格,而没有任何关联的指标,那么常规报告工具 + SQL 查询可能是更好的方法。

旁注:您无法通过反转 many:one 关系来克服此错误。该EMP表包含每一个行EMPID。无论是CONTACTINFO销售表包含相同的多个行EMPID。这意味着emp表必然是与这两个表的关系的“一方”。你不能随意改变它。