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

时间:2017-03-05 08:52:40

标签: foreign-keys relationship data-visualization powerbi

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

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

EMP.empIDcontactInfo.empID之间存在明显的一对多关系。外键约束已成功实施。

但是,我只能在PowerBI中创建多对一关系(contactInfo.empIDEMP.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)

重现错误:

数据库架构如下:

schema

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

1 个答案:

答案 0 :(得分:3)

扩展我的评论以回答:

问题的根源

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

更深入的解释

假设您有1个 emp 行,它连接到 sales 表中的10行,以及 contactInfo中的13行表。在SQL中,如果从 \ temp 行和外部联接开始到其他2个表,则会返回(1 * 10)*(1 * 13)行(总共130行) )。对 sales 表中的每一行重复 contactInfo表中的每一行。

如果你做了类似销售的事情并且没有意识到单个销售记录被重复13次,那么重复可能是一个问题,但是否则可能会很好(例如,如果你只想要一个销售清单和所有相关的触点)。

Power BI vs. SQL

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

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

我们假设您的销售表中有一个名为 Amt Sold 的指标。如果您引入 empName productName Amt Sold 列,Power BI将确切知道如何划分 Amt Sold < / em>在 empName ProductName 之间。没问题。

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

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

我的建议

  1. 如果可以,我建议您在引入之前更改数据模型.Power BI最适合使用单个事实表,其中包含您的指标(如销售金额)。然后,您可以将此事实表连接到任意数量的查找表(例如客户,产品等),直接。这允许你切片&amp;使用任何查找表中的任何属性组合来量化指标。我建议查看星型模式数据模型和查找表的概念:powerpivotpro.com/2016/02/data-modeling-power-pivot-power-bi
  2. 至少,您需要展平表格(即将 contactInfo sales 表合并到一个表中,然后再将其导入数据模型。< / LI>
  3. Power BI可能不是您尝试完成的最佳工具。如果您想要的只是一张显示所有销售额的表格。员工的联系信息,没有任何关联的指标,常规报告工具+ SQL查询可能是更好的方法。
  4. 旁注:您无法撤消多个:一个关系以通过此错误。 \ temp 表每个 empID包含一行。 contactInfo sales 表都包含多个具有相同 empID的行。 这意味着 \ temp 表必然是&#34; one&#34;与这两个表的关系的一面。你不能随意改变它。