Power BI之DAX神功:第4卷第8回 通过公共维度实现多对多关系
《权威指南》在这节课要表达的意思非常简单,但是由于表格数量、无关列数量、语言等障碍,给个别小伙伴造成困扰,我们将学到的知识融汇贯通,用中文来叙述原理。
一、千万不要忘记多对多关系是弱关系


需求:我要使用客户表中的【国家】列筛选2021年销售金额和任务表。这个任务表是2021年的任务。
友情提示:如果不需要更多日期的颗粒度,不建议使用日期表。
【1】确定总金额
【2】通过筛选器,筛选出2021年销售
【3】确定销售任务
将以上三个度量值放到矩阵上:
由于你的多对多关系使用了双向箭头,所以行标题的国家来自:客户表和任务表结果都一样

声明:当使用双向箭头时,可能会使模型产生歧义。我会在《DAX神功》第4卷第12回讲解。所以建议大家一定要这么用时,请确定谁筛选谁?如下图所示,单向箭头,你在矩阵行标题中就只能使用客户表的国家列。

重点:这个问题会影响你数据的准确性,我们从《DAX神功》第4卷第6回理解了多对多关系是弱关系,在《DAX神功》第4卷第7回最后一个问题,我们提到了空行问题,这里要提示大家,在弱关系下,如果存在无效记录,这两个表都会忽略空行。这就回到了上节课最后的问题,是否影响你的最终结果只有你自己明白。所以一直都不建议大家多对多直接连线,除非你对自己的数据了如指掌,说实话,我对我的教学案例可以做到了如指掌因为一共也没几行,但是工作中面对几十万行数据时,我心里也没谱,多对多我不敢用。
二、再看看数据沿袭方案
我们断开客户表和任务表的关系,

这时你不能使用summarize函数,因为上节课“层级关系”那张表是桥接表,桥接表在模型中起到承上启下的作用。现在任务表与其它表没有关系,《火力全开》笔记24.02对TREATAS函数是怎么解释的?是不是写着:无关系下查找匹配

于是,我们将度量值写成下面的样子:
返回结果:

如果你的行标题不只是使用客户表[国家]列筛选,比如,还需要商品表[品牌]列筛选,那就继续增加TREATAS函数
注意:行标题用的是哪张表的哪个字段?(新人总犯这总错误)

返回结果:

三、建立公共维度
现在我们对商品表和任务表增加一些数据:如下图

所谓公共维度,大家注意不是使用桥接表(桥接表是父子层级),公共维度就好比《西游记》中的观音菩萨,当年孙悟空一怒之下毁了人参果树,镇元大仙太厉害了孙悟空打不过,为了救出师父和师弟,各路神仙都不敢管,最后来到东海向观音菩萨求救。观音菩萨将人参果树起死回生,化解了悟空和镇元子的矛盾。公共维度就是左手拉着孙悟空,右手拉着镇元子,对他们说:你们和好吧!
为什么要使用公共维度:因为使用数据沿袭仍然会造成分析结果不正确,例如我在任务表上增加一个新品牌,如果使用数据沿袭的方法在结果上会被过滤掉,理由非常简单:因为任务表与其它表无连线关系,我们用商品表[品牌]筛选任务表[品牌]。保留的是不是商品表中应该有的品牌?
TREATAS(VALUES('商品表'[品牌]),'任务表'[品牌]) // 通过第1参数筛选第2参数

Ps:这里的微软指的是微软中国分公司。
所谓公共维度:要认识孙悟空和镇元子,你想红孩儿来了,镇元子能听他的吗?观音菩萨就不一样了,镇元子要给菩萨面子,悟空就听菩萨的话。现在我们将商品表看成孙悟空,任务表看成镇元子。把他们两表品牌列所有品牌拿到手。
以品牌为例,需要提取两张表品牌列所有数据合并到一起后的不重复值,就是将两个列合并到一起再去重。

将两个列拼到一起:UNION(表1,表2) //《DAX神功》第3卷第7回
再使用DISTINCT对UNION生成的表去重
返回结果:

四、公共维度和桥接表的区别:
桥接表:利用层级关系(多端表)来处理两个一端表,通过父子层级进行连接。
公共维度:利用一端表处理其它两个表之间的关系。(因为商品表、品牌表、任务表中品牌都是一对一也没问题,但是真实的数据中你商品表和任务表品牌99.99%是有重复的)

接下来使用最简单的度量值:
返回结果:

如果你想对国家维度也做同样处理,方法同上。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等