前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DAX - 正确地提出好问题 - 你真的理解SUM吗

DAX - 正确地提出好问题 - 你真的理解SUM吗

作者头像
BI佐罗
发布2021-08-25 15:16:48
1K0
发布2021-08-25 15:16:48
举报
文章被收录于专栏:PowerBI战友联盟PowerBI战友联盟

在学习 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的坑爹之深

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI战友联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题重述
  • 问题分析
    • 问题 1
      • 问题 2
      • 总结
      相关产品与服务
      腾讯云 BI
      腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档