PowerBI数据建模,为什么不建议你使用双向关系?
文/陆文捷
物流供应链优化分析师,Power BI爱好者,知乎:Beethovenist
经常有伙伴会在星球中询问在数据模型中,如何通过事实表对维度表筛选计算的问题,此类需求在PowerBI中启用表之间双向筛选配合度量值可以解决。
但在复杂的数据模型中开启双向筛选会对度量计算产生让使用者难以察觉的影响。本文就此结合案例,和大家一起揭开这一隐秘的角落。
假设模型如下:
数据模型由不同维度表和销售订单/采购订单建立的一对多关系。分别对客户[客户名称]和 产品[产品子类别] 字段建立切片器,此时这两个切片器无法互相筛选。
因为当前模型中这两张表都是作为一端对多端的事实表进行筛选,尝试将'产品’和'销售订单’两表间的双向筛选激活:
此时物理模型间的箭头也同时指向了两端
开启前两个切片器均显示全局数据;开启后选择不同客户时相应的产品子类别也在动态变化,不难理解双向筛让'客户’表的数据通过'销售订单’表能够对'产品’表的数据进行筛选。是不是很方便?
再次观察数据模型,发现此时的'日期’表’筛选采购订单表有两条路径:
直接路径:'日期’->’采购订单’
间接路径:'日期’->’销售订单’->’产品’->’采购订单’
Power BI对这类多条路径指向同一目标表的情况通常会自动选择具有最短传递层级的那一条,也就是'日期’->’采购订单’的直接路径。很自然,也很智能的做法。
那么双向筛选是不是解决各类表与表之间的相互筛选的良方?激活所有的双向筛选就可以一劳永逸了?
不妨基于更为复杂的模型创建度量值验证上述疑问。
根据数据模型,用三种颜色标记三条数据筛选的流向,
1、'客户’表会对'采购订单’进行筛选
2、'日期’表会对'销售订单’进行筛选
3、'日期’表会对'采购订单’进行筛选
特别注意:'日期’和'客户’表会同时对'销售订单’进行筛选,也同时对'采购订单’进行筛选,那么此时如果用日期表来筛选采购订单表:
Power BI还会通过最短路径(3深蓝色线路)执行筛选吗?
还是会通过销售订单的的间接路径关系进行筛选?
又或者两者兼用?
实践是检验真理的唯一标准,创建度量值来验证下吧,
采购数量 = SUMX( '采购订单' , [数量] )
'客户’[客户行业]->'采购订单’表的筛选路径为标注的蓝色线路;'日期’[年份名称]-> '采购订单’表的筛选路径同时有两条起作用:标注的深蓝色线路以及借由'日期’表与'销售订单’表之间的关系(标注的橙色线路)进而间接地对采购订单表的筛选。
利用CROSSFILTER函数断开日期表与采购订单表的筛选看看是什么结果:
采购数量.无日期-采购订单筛选 = CALCULATE( [采购数量] , CROSSFILTER( '日期'[日期] , '采购订单'[发货日期] , None ) )
用CROSSFILTER取消日期表和采购订单表间的筛选,'日期’[年份名称]和'客户’[客户行业]对采购订单表的筛选全都经由销售订单表这座桥梁来完成。计算结果发生了变化。
同样的方式,如果断开日期表与销售订单表的关系,又会变成什么样的结果呢?
采购数量.无日期-销售订单筛选 =
CALCULATE(
[采购数量] ,
CROSSFILTER( '日期'[日期] , '销售订单'[发货日期] , None )
)
这一次是取消日期表和销售订单的筛选,你变我也变~,当然又是不一样的计算结果啦。
注:CROSSFILTER函数作用是更改表之间的筛选流向(SINGLE-单向,BOTH-双向,NONE-取消筛选)。
实践结论:
由于销售订单表和产品表双向筛选的存在,使得模型中同时有两条路径能让日期表对采购订单表进行筛选。
当使用CROSSFILTER取消 日期-采购订单 或 日期-销售订单 的任一筛选传递,日期表会根据另一条有效路径对采购订单进行筛选;
不作任何处理时,两条路径同时生效。
不同的筛选传递都带来不一样的计算结果,如果用户没有察觉其中的细微之处,即便定义了符合业务逻辑的计算,也有可能得到背离初衷的结果。
案例中的数据模型有五张表,一条双向筛选,就已经对计算产生多种影响。实际业务场景往往模型更为复杂,某一个筛选流向的变化都可能生出一个数据迷宫。
下一次激活双向筛选前,你是不是要三思而为呢?
参考文章: