欢迎光临散文网 会员登陆 & 注册

Power BI之DAX神功番外篇:第11回 导航上有多条路,为什么选择最拥堵的那条路?

2022-03-28 14:11 作者:孙兴华zz  | 我要投稿

在回答问题前,我给你们讲个故事,我买完xbox series s开通了XGP,里面可以免费玩生化7,但是第一人称(逃生)不适合我,由于生化8有国语配音,我想在PS5上买生化8,为了这个我去XGP上玩生化7,玩到被老丈人追的那里就玩不下去了,我开始思考,玩游戏本来就是一个开心的事情,何必花钱难为自己呢。

PowerBI中的DAX也是一样,如果你是一个项目开发人员,你研究这些东西是正常的,但是我并不是给项目开发人员做培训的。我只是无条件帮助办公室人员的。换句话说,你就假设我是驾校的教练,帮你考驾照的,漂移是赛车手的事情。不是说我会的就都要讲出来,会不会给别人造成困扰也是我要考虑的因素。

做为新人,用一张干净的数据表来做分析才是你的最佳选择,当您的目标是数据分析师时,原理应该是你自己推导,而不是问出来的。那我接下来讲的这些东西,完全都是推导出来的,推导是一个过程,正是要用这个过程来锻炼思维和逻辑。

一、网友问题

个人建议:您的数据看似简单,但是为了学习原理,还可以更简单,越简单的数据越直观。

特殊说明:您与《DAX神功》番外篇第1回 网友遇到的问题是不一样的

最简单的例子,世界上每个国家在各个领域都有相关的法律法规,既然有法律法规,那为什么各国法官还要商讨每个案件应该如何判决呢,为什么要有律师呢?为什么不直接按法律法规执行呢?同样的道理,没有什么东西是可以套用的,除了发音等没有技术含量东西是通过记忆和死记硬背的,其它都是需要人为思考的。

二、先解决你关于度量值Value2的问题

【1】当你使用sum('表'[大小]) 为了研究原理尽量别用一端表举例了?您要先理解sum('表'[大小]) 的作用。

表名:表

新建度量值:

因为矩阵上行标题是【类型】所以工作原理如下

我们将度量值A放到矩阵中:

这里为什么是11,而不是5+4=9呢?因为《DAX神功》第1卷第19回 独创的"母子关系"

PS:如果您想让总计显示为9也是可以的,我们在《DAX神功》中讲了如何让总计单独计算,不要问我是哪一集,知识一定要按顺序系统学习,为了解决问题而去看某一集,换个问题还是不会。

接下来我们新建度量值:

因为all('表')在Filter中只是表函数,但是出现在Calculate中就起到了调节器的作用。all('表')的意思是指定表所有列删除筛选。因为度量值A的总计是11,所以度量值B的总计是每行都是11

为什么类型B显示为空而不是11呢?因为类型A和C是由Filter筛选的,filter表与filter+all表在filter中是一样的,度量值【B】就是A和C这两个类型的总和值

证明:类型A总数是5,度量值【A】也是5,类型C总数是4,度量值【A】也是4

行标题并未参与度量值A的筛选,所以当使用calculate+All表时,只有类型A和C是11

总结:就是因为母子关系,内层没有被行标题筛选

【2】理解“母子关系”工作原理

新建度量值

calculate(SUM('表'[大小])) 不就是等于度量值 [总数] 吗?度量值具有筛选功能,所以工作不原理如下:

所以放到矩阵中是这个样子的:

同理我们新建度量值

因为使用了all(表),当度量值C的总计是7时,度量值D的每一行都是7

为什么这里B不显示为空,而每行都显示为7,filter筛选出了A和C的总和值,但是因为你使用母子关系,度量值【C】受到了行标题的筛选,证明:A的总数是5,度量值【C】是3

所以,因为行标题筛选了度量值【C】,已知Calculate中使用了all表,所以每行显示为7

总结:就是因为母子关系,内层被行标题筛选了

三、再解决你关于Value1的问题

【1】先分析Filter表的情况

为什么说您的问题与《DAX神功》番外篇第1回并不是一件事

在你的案例中,度量值  [TOTALD]=SUM('表(2)'[大小])

但是您能证明:[TOTALD]=5  吗?

这个等式并不成立,所以在我的案例中  [总数]≠3

为了说清楚这件事,我刚才的表,还需要做以下修改才能直观表示(增加一行数据)

表名:表

我们分别下出下面三个度量值:

将它们放到矩阵中:

工作原理:

示意图:在filter里面的筛选

已知 sum('表'[大小]、矩阵行标题是类型,所以 类型聚合(分组), 适配度量值【总数】

每个类型的紫色数字与红色数字进行比较:

sum('表'[大小])<[总数]:只有类型C对应的4

sum('表'[大小])=[总数]:只有类型B对应的2

sum('表'[大小])>[总数]:类型A对应的2和3(加在一起是5),类型C对应的-1

现在我们知道原理了,下面的这个度量值:

放到矩阵中,这一步的逻辑绝对是小学数学题

【2】再分析Filter+all表的情况

还是新建3个度量值来分析

放到矩阵中:

接下来我们解释为什么会这样

<1>  sum('表'[大小])<[总数]:

因为我们使用了all(表) ,现在需要用紫色字体全部数字与每个类型对应的红色数字进行比较

类型A:【总数】紫色字体没有任何一个数比A对应的sum('表'[大小])的值5更大,所以为空。

类型B:【总数】紫色字体有3和4都比B对应的sum('表'[大小])的值2更大,所以显示3+4=7

类型C:【总数】紫色字体只有4比C对应的sum('表'[大小])的值3更大,所以显示为4

<2>  sum('表'[大小])=[总数]:

因为我们使用了all(表) ,现在需要用紫色字体全部数字与每个类型对应的红色数字进行比较

类型A:【总数】紫色字体没有任何一个数等于A对应的sum('表'[大小])的值5,所以为空。

类型B:【总数】紫色字体中有两个2等于B对应的sum('表'[大小])的值2,显示为2+2=4

类型C:【总数】紫色字体只有一个3等于C对应的sum('表'[大小])的值3,所以显示为3

<3> sum('表'[大小])>[总数]:

因为我们使用了all(表) ,现在需要用紫色字体全部数字与每个类型对应的红色数字进行比较

类型A:【总数】紫色字体每个数都小于A对应的sum('表'[大小])的值5,所以把紫色字体所有的数都加在一起2+3+2+4+(-1)=10

类型B:【总数】紫色字体只有一个负1小于B对应的sum('表'[大小])的值2,所以显示为-1

类型C:【总数】紫色字体有两个2,一个负1小于C对应的sum('表'[大小])的值3,所以2+2+(-1)=3

最后我们再次利用小学数学的知识把它写成:

因为母子关系的原因,内层没有被行标题筛选,如果我们对内层使用了Calculate实现了行标题对其内层筛选的功能,那不又回到了我们上面的问题。所有行都返回10

《孙兴华讲PowerBI火力全开》PowerBI必学课程

https://www.bilibili.com/video/BV1qa4y1H7wp

《DAX神功》文字版合集:

https://www.bilibili.com/read/readlist/rl442274

《DAX神功》视频版合集:

https://www.bilibili.com/video/BV1YE411E7p3

PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等

https://www.bilibili.com/read/cv10222110

Power BI之DAX神功番外篇:第11回 导航上有多条路,为什么选择最拥堵的那条路?的评论 (共 条)

分享到微博请遵守国家法律