Power BI中如何处理相同名称的客户

tech2023-01-20  101

本文翻译自国际Power BI大师Alberto Ferrari的文章——《Handling customers with the same name in Power BI》,本文介绍了如何通过使用零宽度空格在Power BI报告中显示具有相同名称的不同客户,从而使表达得到了简化,无需添加可见字符即可使名称具有唯一性。*

有时,我们处理两个或多个相同类型的实体具有相同名称的情况。如果我们以客户为例,数据模型将同时存储客户编码和客户名称,以正确识别每个客户。客户编码将具有相同名称的两个客户标识为唯一。

Contoso示例数据库包含许多同名的客户。例如,请看下表:有两个名为Jordan Allen的客户。它们的名称相同,但客户编码不同。事实上,他们生活在不同的州,他们的客户历史可能会非常不同。

如果我们只将客户名称保留在表中,并删除使它们不同的所有列,则Power BI会合并这两个客户,并显示误导性的数字。只查看下面的矩阵,用户可能会错误地得出结论,客户Jordan Allen购买了价值810.94美元的产品。然而,这从来没有发生过,因为这个数字是两个同名的不同客户购买的总和。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCpQ6LOg-1599110963559)(https://pbihub.cn/uploads/images/202009/03/125/OTOOZQPe0z.png)]

Power BI按客户名称分组生成查询。如果两个客户共享相同的名称,则它们将显示为单个客户。

解决这种情况的一个选择是将客户编码附加到客户名称上,以保证客户名称始终是唯一的。使用客户编码是一种有效的技术,但是结果并不美观,因为我们用客户编码污染了Name列。

还有另一种技术可以用来使名称唯一,同时保持名称的可视化不变。我们可以使用零宽度空格,这是Unicode集合中一种非常特殊的空格字符。

零宽度空格是影响某些书写系统中单词打印方式的特殊字符。在这篇文章中,我们对它们在印刷方面的用途不感兴趣,而是对它们肉眼看不见的独特特性感兴趣。您可以在https://en.wikipedia.org/wiki/Whitespace_character.了解更多信息。在众多的零宽度空间中,我们选择了零宽度非拼接器Unicode 8204。

想法是这样的:如果我们在第二个Allen,Jordan的末尾加上一个零宽度的空格,它看起来和第一个Allen,Jordan是一样的,但它是不同的,因为他的名字在末尾包含了隐藏的空格。

如果我们有两个以上的同名客户怎么办?

DAX可以帮我们解决,我们可以为客户名称创作一个新的计算列,在该列中,我们在原始名称后面附加适当数量的零宽度空格,以确保客户名称无论如何都是唯一的。

要创建列,我们必须标识具有相同名称的客户,使用客户代码对其进行排名,然后添加空格:第一个客户为零个空格,第二个客户为一个空格,第三个客户为两个空格,依此类推。通常,一旦我们有了客户的排名位置,我们添加的零宽度空格就等于它的排名位置减1。名称唯一计算列实现了此技术:

Name Unique = VAR CustomersWithSameName = CALCULATETABLE ( SUMMARIZE ( Customer, Customer[Customer Code], Customer[Name] ), ALLEXCEPT ( Customer, Customer[Name] ) ) VAR Ranking = RANKX ( CustomersWithSameName, Customer[Customer Code],, ASC, DENSE ) VAR Blanks = REPT ( UNICHAR ( 8204 ), Ranking - 1 ) VAR Result = Customer[Name] & Blanks RETURN Result

在人眼看来,“名称唯一”列中的结果与“原始名称”列中的结果相同。DAX则不同,因为同名不同客户的名称末尾有零宽度空格。实际上,矩阵中的名称唯一列产生了下面的可视化效果。

高亮显示的具有相同名称的客户显示在不同的行中,尽管它们具有相同的名称。附加到客户名称的零宽度空格不会增加名称本身的视觉长度。事实上,Contoso数据库包含385个没有名字的客户。如果我们附加一个规则的空格,那么最后一个空客户的名字的长度将是巨大的:385个空格。通过使用零宽度空格,名称仍然看起来是空的,即使最长的名称有385个字符。

为了简化用户的浏览体验,可能需要显示Name唯一列,隐藏原始Name列,然后重命名它们,以便用户只看到包含唯一名称的Name列。这样,分隔同名客户的预期行为就是默认行为。也就是说,原始的Customer[Name]列仍然有用。例如,要检查客户名称是否为空,必须使用原始Customer[Name]列。The Customer[Name Unique]列从不包含空字符串,而Customer[Name]可能包含空字符串。

这项技术适用于大多数当地文化和语言。请注意,零宽度空格在某些语言中有特定的含义。因此,检查需要的是您是否可以安全地在特定区域性中的名称末尾添加一个零宽度空格,而不会更改其可视化效果。

PowerPivot工坊原创文章,转载请注明出处!

如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

最新回复(0)