暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PowerBI中的多对多关系与一对多关系的区别

BISeven 2021-10-31
5510

在PowerBI建立模型时,如果两个表之间的关系不满足多对一或者一对多的关系时,该怎么办?一般情况下,是建立一张桥接表,如下:


有一张销售表,记录每个省份的销量


另一张城市的表,如下:

 

很显然,这两张表之间都有Province列,但是都不是唯一的,这个时候两张表之间的关系不满足一对多或者多对一的关系,那这个时候该怎么办呢?传统的解决方案是建立一张桥接表,该表仅包含一列Province列,是由销售表和城市表中所有省市的组合:

 

由这三张表建立的模型如下:

 

红框内的表就是桥接表,这样就满足了多对一的关系,在此列中两条关系都是双向的,那么CityData 和Sales-1能够相互筛选:那么此时,我们就可以使用Province表中的省份建立如下可视化对象:

 

我们也可以使用CityData-1表中的省份建立上述的可视化对象:

 

 

这两种方法生成的可视化对象有些区别:因为在使用CityData-1中的省份时,只列出了存在于CityData-1中的省份,不包含湖北的数据,尽管sales的总和包含湖北的销量,所以你应该采用低一种方案。


除了这种解决方案,现在PowerBI也已经支持直接建立多对多关系了,那么多对多关系的结果又是怎么样的?模型如下:、

同样,我们使用CityData-2中的省份建立可视化对象,其结果同上述提到的解决方案

 

其结果也是不包含不存在于CityData-2表中的省份,但是其销量的汇总值包含湖北的销量,多对多关系除了这点需要注意外,还有再使用表筛选时,尤其要注意:

 
all.sales2 =
CALCULATE(sum('Sales-2'[sales]), all('Sales-2'))
复制


 

上述利用ALL函数清除来自Sales-2表的筛选器,但是并不能清除来自CityData-2表的筛选器,所以结果如下:

 

 

那这个时候该怎么办呢?

有两种解决方案:

1. 使用ALLCROSSFILTER函数

 

all.sales2-1 = 
CALCULATE(sum('Sales-2'[sales]), ALLCROSSFILTERED('Sales-2'))
复制


2. 不要用表筛选,直接用列筛选

 

all.sales2-2 = 
CALCULATE(sum('Sales-2'[sales]), ALL('CityData-2'[Province(CityData)]))
复制


 

 


所以,综上所述,多对多关系与多对一关系不同的地方:

1. 显示的值中不包括用null值表示在另一张表不存在匹配的情况(参考一对多关系和引用完整性)


2. 在使用ALL(table)时,不能通过多对多关系清除其他相关表表的筛选器(这点尤其注意)


3. 无法使用related函数

文章转载自BISeven,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论