我在PowerBI中有两个来自Azure SQL的表,使用直接查询:
EMP(empID PK)
contactInfo(contactID PK, empID FK, contactDetail)
从EMP.empID
到contactInfo.empID
之间存在明显的一对多关系。外键约束已成功实施。
但是,我只能在PowerBI中创建多对一关系(contactInfo.empID
到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)
重现错误:
数据库架构如下:
我想要的是PowerBI中的一个表格,显示员工的联系方式和销售信息,即加入所有四个表格。当视觉表的VALUES包含“empName,contactDetail,contactType,productName”时,将发生错误,但是,如果我只包含“empName,contactDetail,contactType”或“empName,productName”,则不会发生错误。起初我认为问题可能在于contactInfo和emp之间的关系,但现在看起来似乎更复杂了。我想这可能是由多个一对多关系造成的?
答案 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会显示您正在看到的错误。
我的建议
旁注:您无法撤消多个:一个关系以通过此错误。 \ temp 表每个 empID包含一行。 contactInfo 和 sales 表都包含多个具有相同 empID的行。 这意味着 \ temp 表必然是&#34; one&#34;与这两个表的关系的一面。你不能随意改变它。