DAX 实战套路(二)——复杂度量计算的套路

实际工作中,我们经常碰到一些复杂的度量计算,尤其是在KPI考核中,我们来看下如何解决这类问题。
file
模拟数据如上,求每个部门平均每位客户的销售金额。这里面有个坑,有的订单存在退货行为,当这个订单完全退货(销售总额为0时),这单是没有交易成功的,你不能把没交易成功的客户也计入平均。其实解题思路还是比较清晰的,按照部门客户来汇总,然后剔除交易金额为0的客户,再按部门来求平均。
虽然思路很清晰,但是在DAX里如何解决呢?可能很多同学写着写着就被复杂的上下文给弄晕了,哪里该用calculate函数转化上下文,哪里不该转化也搞不清楚了。我们来介绍一种解决这类问题的万金油套路——addcolumns+summarize的套路。
可能每一位童靴在学summarize的时候,老师都讲过,这个函数用于创建链接回表,或者PBI里创建新表,最好不要用于求度量值,但是没有一位老师说过原因。其实原因在这里:https://www.sqlbi.com/articles/all-the-secrets-of-summarize/
如果看不懂或者不理解,没有关系,只要记住结论就行:我们分组求和一般不直接用summarize,因为在某些时候会造成不必要的错误,我们一般用summarize来分组,用addcolumns来聚合,具体套路如下:
file
理论讲完了,我们看看实践中如何应用,我们先用summarize对销售表按部门按客户来汇总求和(注意calculate函数不可省略)
file
得到的结果非常清晰,接下来我们要剔除这里面金额为0的订单,因为是虚拟列,跟lineage理论,这里只能用filter函数筛选,
file
接下来我们直接用averagex函数对销售额字段求平均就得到了我们想要的结果
file
总结一下,我们先用summarize对表进行分组,如果在聚合前,表中需要筛选,例如剔除标记为无效的订单,我们可以在summarize的第一参数中用calculatetable函数先进行筛选,然后再聚合,聚合之后剔除不满足条件的,然后得到我们想要的维度,再进一步聚合。这个套路的好处就是每一步思路清晰,不用考虑太多上下文的问题,而且DAXSTUDIO中都能看到结果,便于验证。另外给出张文洲老师的另一种解法
file
此种解法更为优秀,但是对上下文要求更高。欢迎其他各位小伙伴提供更多的解法。

佐罗老师DAX实战课程链接:https://study.163.com/course/introduction/1006191059.htm?share=1&shareId=1144761414
限时送价值198 DAX基础课程(仅限本链接购买)和价值288会员模板,提供内部答疑群,购买后联系QQ:40733580