最近一位同事求助:“ 我已经在PQ去重, 但是建立关系时还是提示“多对多”,排查了很久没找到问题,已经快疯了!”
场景重现:
由于相同的"Product Name"会有在不同"Manufacturer"生产的情况,所以为了保证主键的唯一性。执行了两个步骤:
在PQ界面创建了一个联合主键PorductKey
[Product Name] & [Manufacturer] 联合主键删除重复

然而, 当建立关系时候, 却提示"多对多"关系。

找到联合主键PorductKey中的重复值
创建创建一个度量值IssueDiscoverer ,计算product表中的行
IssueDiscoverer =COUNTROWS( 'Product' )将联合主键PorductKey, 放在矩阵的行,IssueDiscoverer 放在值上。找到数字大于一的值是"WWI Wall Lamp E315 SilverWIDE WORLD IMPORTERS"。

转到Product 表的Power Query 界面,发现虽然在执行了删除重复,因为Manufacturer有两个相同值为"WIDE WORLD IMPORTERS" 和 "Wide World Importers",但是大小写不同。

解决方案:
问题已经发现: PQ(Power query) 严格区分大小写,执行去重操作时,不同大小写的相同值将被认为是非重复值。(SQL某些去重函数例如DISTINCT也有相同行为),然而在Power BI 客户端界面,建立关系和将字段放在可视化行列轴时候, 却默认不区分大小写, 即:不同大小写的相同值将被认为是重复值。
由于我们无法修改Power 客户端这种默认行为,那么我们在PQ或者使用SQL函数, 可以将联合主键使用到的字段内的值统一改成大写或者小写。
这里,我们在建立ProductKey主键和去重步骤前,插入新的步骤:
将"Prodcut Name"和"Manufacturer"的值在PQ 界面全部改成大写如下:

然后, 再和Sales 事实表, 建立关系,成功建立“一对多” 关系,如下:

最佳实践
在Power BI中创建主键时,应该遵循:
如果条件允许, 总是使用数字而非文本字符串
总是在PQ界面对主键"删除空"
如果使用联合主键,总是在连接的两列中间加入特殊字符, 例如"^", "*"
如果使用联合主键,总是使用SQL函数或者在PQ 界面将英文字母统一转化为大写或小写




