昨天晚上赶616了,头晕脑胀。其实我也没有搞清楚什么规则。只是发现今天早上买和昨天买其实价格一样。
算了,这么伤脑子的事情,不适合一个懒胖子。还是老老实实干活吧。
需求数据如下:
其中Weighted days是用Excel公式做的。取其中一行内容如下:
=$B2/SUMIFS($B$2:$B$13,$D$2:$D$13,"Win",$F$2:$F$13,$F2)*C2
逻辑描述下:
算Status是Win的计算;
其中月份是要根据所在行的月份分组的;
计算公式,分子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。度量值里面引用的也是表达式或者度量值,因为度量值依靠于一定的字段值,所以对于汇总部分,要考虑清楚会不会得到想要的值。所以具体问题具体分析吧。
谢谢关注。你的关注转发就是我前进路上最大的助力!一起成长。