DAX分享13:如何用DAX实现SUMIF

浏览: 1889

昨天晚上赶616了,头晕脑胀。其实我也没有搞清楚什么规则。只是发现今天早上买和昨天买其实价格一样。

算了,这么伤脑子的事情,不适合一个懒胖子。还是老老实实干活吧。

需求数据如下:

其中Weighted days是用Excel公式做的。取其中一行内容如下:

=$B2/SUMIFS($B$2:$B$13,$D$2:$D$13,"Win",$F$2:$F$13,$F2)*C2

逻辑描述下:

  1. 算Status是Win的计算;

  2. 其中月份是要根据所在行的月份分组的;

  3. 计算公式,分子fee:fee,所在行(row)为win的单值;分母total:status为win的,month分组之后的总和值。分子fee/分母total*所在行的Conversion days。


第一步先做出分母的total值。这个是整个计算的关键。

就这个需求来说,很简单,因为所有的内容都在同一张表里面。分母total需要考虑两点,一是对status的filter还有就是对Month的分组,所以total的计算公式如下:

CALCULATE(SUM('表'[Fee]),FILTER(ALLEXCEPT('表','表'[Month]),'表'[Status] = "Win"))

这里我没有建立一个新的measures或者calculated column,这只是一个思考过程。还没有做完。

第二步就是逐行计算。这里,我们新建一个Calculated Column。用变量的形式来实现,思路比较清晰。

Weight days = VAR total = CALCULATE(SUM('表'[Fee]),FILTER(ALLEXCEPT('表','表'[Month]),'表'[Status] = "Win"))VAR fee = '表'[Fee]VAR cv = '表'[Conversion days]VAR weigh = DIVIDE(fee,total)*cvreturn weigh

VAR和Return是固定搭配,VAR是定义变量,Return是返回结果。

对于每一行,都会逐行去检索计算。

最后的结果如下图所示:

完全还原需求的4月的weight days

好像还不错吧~~

还有点随便说说的,关于什么时候建Measures还是建立Calculated Column,我想了很久,也不知道怎么表达更合适。不过,一般来说,如果度量值能实现的话,尽量就建度量值,这个是SQLBI的大佬推荐的,从性能和实现角度考虑的。此时此刻,我能想到的关于度量值的一点局限性。度量值依靠于一定的字段值,所以Meaures度量值可以做某个visual的filter但是不能做page的filter,所以也就不能做Slicer。度量值里面引用的也是表达式或者度量值,因为度量值依靠于一定的字段值,所以对于汇总部分,要考虑清楚会不会得到想要的值。所以具体问题具体分析吧。

谢谢关注。你的关注转发就是我前进路上最大的助力!一起成长。


推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册