在学习 Power BI 的 DAX 过程中,不免会遇到一些问题和你想的不一致。例如以下问题来自伙伴在实际业务中涉及到的公式,我们来拆解并帮助大家梳理对于 DAX 的理解。
问题重述
首先,伙伴将真实的复杂模型和问题简化,给出了一个适合被讨论的模型,如下:
更具体地,本问题涉及到的问题限定在:
大概 90% 的人,是不会化简问题的,他们的直觉表现是:老师,为啥我的计算不对呢?老师永远只有一个回答:因为你算错了啊。一个没有意义的问题,只能迎来一个没有意义的回答。
当可以把问题具体化到一个信息充足的地步,才可以被讨论和回答。本案例的问题现象如下:
提出问题的伙伴将度量值名称和所有内容提供出来,并且将内容彻底简化到一个可以被直接定位的程度。这显示了该伙伴非常珍惜和尊重别人的时间,因此,将自己能做的极限全部呈现,并最大程度地锁定了问题的范围,更进一步的,将自己的分析和探索实验的差异以及困惑的问题点全部高量出来。
至此,这个提问的姿势是非常非常正确的。
如果,你可以除了跑完你的那一段,还可以送你队友一段,这种默契才是工作得以高效进行的暗力量。这种力量也会决定你的周围会是同类,以及会有同类来帮助你。正相反,把队友不当队友,直接甩过去问题的方式,必将在日后得到同样反馈。亲眼目睹 80% 的人是自扫门前雪,从来不会多做一点超过自己范围的事,这样的短视非常好,因为,正是有绝大多数这样的人的存在,才推高了极少数人的价值。这种极少数的人的价值本来就是应该的,然后却变成了弥足珍贵的品质。倒退就是这样,不是别人在进步,只是有很多人在倒退或停滞不前而已,仅此而已。
问题分析
在这么清晰的问题描述下,老师几乎可以 1 秒锁定问题并节省了 99.99% 的理解问题的时间,可以被得到这样的尊重,那么,你必然会得到你绝对满意的回答。超越你看到的所有书籍,为你量身定制回答。
问题 1
对于度量值:
代码语言:javascript复制
FILTER SUM =
VAR TABLE1 = FILTER( '客户' , SUM( '订单'[数量] ) > 20000 )
RETURN CALCULATE( [合同数量] , TABLE1 )
// 其中,合同数量 = SUM('订单'[数量])
效果如下:
分析如下,对于以上矩阵的每一行,都受到该行的筛选的影响,于是:
VAR TABLE1 = FILTER (' 客户 ' , SUM ( ' 订单 '[数量] ) > 20000 )
这里的注意点有:
1、客户表在筛选上下文的影响下,只有当前行。例如:德州 F。
2、在计算 SUM 的时候,FILTER 会创建自己的迭代环境,针对仅有的一行客户,计算:SUM (' 订单 '[数量] ) > 20000
3、在 2 中计算的 SUM (' 订单 '[数量] ),由于在筛选上下文中,订单将被当前客户筛选出属于它的订单,因此,只有属于它的订单数量 SUM ( ' 订单 '[数量] ) > 20000 时,才返回真,才能返回出含有 1 行客户的表,否则返回一个含有 0 行客户的表。
4、用 TABLE1 作为筛选器再去计算 [合同数量],凡是 3 中可以返回 1 行的客户都会计算出来,否则计算结果为空。
需要注意的是:
A、第 2 步中的 FILTER 迭代 ' 客户 ' 所产生的行上下文对 SUM 是没有影响的;但是在矩阵里的当前行作为筛选上下文对 SUM 是有影响的。
B、TABLE1 是空,是一种特殊的空,该空表示一个特地的有 0 个客户构成的表,该表用作筛选器覆盖了矩阵中的客户,导致结果是空。
C、FILTER 的第二个参数是判断是否的,如果通过,则迭代的行可以返回,否则被过滤掉,因此有本例的结果。
问题 2
对于度量值:
代码语言:javascript复制FILTER SUMX =
VAR TABLE1 = FILTER( ALL('客户') , SUMX( '订单' , '订单'[数量] ) > 20000 )
RETURN CALCULATE( [合同数量] , TABLE1 )
效果如下:
要理解问题 2 的计算逻辑,就必须先搞懂问题 1 中的计算逻辑,在问题 1 中已经充分说明。
现在来解释这里的计算逻辑,对于任意的一个矩阵图表行,作为筛选上下文,它对度量值的影响如下:
1、VAR TABLE1 = FILTER (ALL (' 客户 ') , SUMX ( ' 订单 ' , ' 订单 '[数量] ) > 20000 ) 中的 ALL (' 客户 ') 会得到所有客户,并进行迭代,但由于 SUMX 中的第一个参数'订单'
所处于的筛选上下文正是矩阵中当前行,注意:不是 FILTER 迭代 ALL (' 客户 ') 的行上下文,在行上下文中'订单'
是不受影响的,只受到位于矩阵行的筛选上下文影星。特别强调:济南 A 是矩阵的一行,但它本身是筛选上下文。
2、由于矩阵行本身的原因,如果对应的订单的数量不是满足 FILTER 条件的,那么 FILTER 的 ALL (' 客户 ') 全部都会返回 FALSE 导致得到空表;而如果对应的订单的数量是满足 FILTER 条件的,那么 FILTER 的 ALL (' 客户 ') 全部都会返回 TRUE 导致得到全表。
由此可知,在济南 A 处的矩阵行,TABLE1 会得到的是全部客户,进而计算得到的结果是与全局总数一致的。
总结
通过问题 1 和 2 的解析过程,我们得到以下收益:
1、如何问问题
经验表明,当你把问题拆分到最极限小的规模时,你就来到了你的极限。A 节省了老师的时间;B 可以彻底理清自己的问题;C 将自己的极限推进和突破。而且往往 80% 的情况,通过这个自我整理问题的过程,会自己解决好问题的。
2、关于 DAX 的使用的建议
DAX 的使用是有着清晰规律的,对于业务人员(强调 100 次:业务人员)使用 DAX 往往需要遵循一些套路,而不是像工程师一样要死扣所有细节,或者自己给自己编制一个有问题的陷阱。这方面是我们后续工作的重点,会推出一些简单的模式供业务人员直接遵守使用。
3、是否必须学习所有 DAX 细节
答案显然是:不需要。尤其是对于业务人员。还记得曾经学习 C 的时候,工程师就一定要去问指针和引用有什么区别,甚至某些操作哪个效率高,对于程序员或者是架构师,的确如此,需要理解最底层逻辑。但对于应用开发者,应该使用 C#,Java,Python 等面向应用的设计语言,而屏蔽底层的复杂性。
DAX 是一门非常有特点的函数。以下 3 件事非常重要,且全部来自官方说法,这里将它们摆在这里告诉你:
第一要事:DAX 是很容易的。这是官方的说法。例如:
看看这里的用词,我猜测这不是机器翻译的,不然怎么能这么接地气呢。
第二要事:DAX 不是为程序员设计的,而是为分析师设计的。只不过不妨碍程序员也成为分析师,也可以深度使用 DAX。
第三要事:DAX 是全球范围唯一的模型驱动的自助商业智能分析工具。
如果你感觉你的理解和上述三点不一致,那么,不要说我,以上 3 点来自官方原话,要喷就直接去官方喷吧。那为什么你的感受完全不同的,很简单,因为你没有学习《BI 真经》。一部学习 Power BI 而不得不学习的内容。我们正在以及持续在这个体系中把 Power BI,DAX 乃至 BI 的本质逻辑和典型套路以最简单方式呈现。
总结:
1、内卷之下,要么躺平,要么好好学习。
2、数字力是一个非常非常重要的机会。
3、数字力工具选 Power BI。
4、学 Power BI 就必须学习《BI 真经》。
这就是严密的逻辑链条。看懂的,就得行动了。没看懂,那就不适合再做分析了。如图:
相关文章
彻底理解 PowerBI DAX 函数 EARLIER
【DAX 系列】高清图解迭代原理并弃用 EARLIER
从SUM让人看看PowerBI DAX的坑爹之深