白茶最近在和小伙伴沟通的时候,经常能遇到一些奇奇怪怪的需求,后来白茶仔细一合计,嗯,妥妥的中国式报表,满足!
BOSS:我花钱雇你来,不是要你觉得,我要我觉得!
白茶:......(@@#¥¥!)好。
先来看看本期的示例文件:
就这么一份示例文件,看起来很简单对吧?
来,我们来看看需求:
1、首先,要求出这个月人工费用的合计;
2、其次,要求出每个人工资的分配占比;
3、并且,根据占比求出个人奖金;
4、然后,求出每个人的实发工资;
5、最后,这些要体现在一个表里。
这个需求,白茶也是醉了,但是木有办法,还得继续啊,将数据导入到PowerBI中,结果如下:
(示例文件会放到知识星球中,小伙伴们可以搜索“PowerBI丨需求圈”,文章结尾处会有二维码。)
将数据放入到Table中查看,结果如图。
编写基础的DAX代码:
代码语言:txt复制工资聚合 =
SUM ( '示例'[工资] )
结果如下:
到这里,所有的准备工作已经完成了。
咱来思考一下思路,因为要求所有的结果都需要呈现在一个表格里面,那么就需要在写DAX的时候,每一段代码都要绕开“奖金”这一项,让其不显示,同时总计栏还要计算无误。
问题思考清楚了,开始编写代码:
代码语言:txt复制工资占比 =
VAR ALLMO =
CALCULATE ( [工资聚合], FILTER ( ALL ( '示例'[名字] ), '示例'[名字] <> "奖金" ) )
VAR EVERY =
DIVIDE ( [工资聚合], ALLMO )
VAR RESULT =
IF ( MAX ( '示例'[名字] ) <> "奖金", EVERY, BLANK () )
RETURN
RESULT
先放在Table中查看,再来解释含义:
ALLMO,在这里的作用是求出不包含“奖金”这一项的其他所有项目的工资总和。
EVERY,在这里是求出每一项占ALLMO的比例,注意:这里包含“奖金”这一项。
RESULT,利用IF的判断,将奖金这一项的显示结果判断为空值,其他项目正常显示。
最后输出结果。
虽然求出每一项的占比了,也不影响后续的计算,但是按照中国式报表的需求,想想我们的BOSS,那肯定是要总计显示的啊!
哎,没辙,编写如下代码:
代码语言:txt复制优化工资占比 =
SUMX (
SUMMARIZE ( '示例', '示例'[名字] ),
IF (
'示例'[名字] <> "奖金",
DIVIDE (
[工资聚合],
CALCULATE ( [工资聚合], FILTER ( ALL ( '示例'[名字] ), '示例'[名字] <> "奖金" ) ),
BLANK ()
)
)
)
先来看看结果,再解释:
这次的结果没有任何问题了。
白茶将代码分为三段解释:
首先是IF作为一组,这组代码中判断是否为“奖金”,TURE返回各项占比,否则返回空值。
其次,利用SUMMARIZE构建可见组合。这个组合就是当IF判断不为空时,由IF为SUMMARIZE提供对应项目的值。空值不显示。
最后,利用SUMX迭代循环的特性,求出SUMMARIZE这个虚拟表的IF判断值。
求出各项占比了,后面的就简单了。
编写奖金代码:
代码语言:txt复制应分奖金 =
VAR MONEY =
CALCULATE ( [工资聚合], FILTER ( ALL ( '示例'[名字] ), '示例'[名字] = "奖金" ) )
VAR TOL = MONEY * [优化工资占比]
RETURN
TOL
结果如图:
编写实发工资代码:
代码语言:txt复制实发工资 =
IF ( MAX ( '示例'[名字] ) <> "奖金", [工资聚合] [应分奖金], BLANK () )
结果:
会发现总计显示还是不对,咋整,优化代码呗!
这里有两种解法:
方法一:
代码语言:txt复制实发工资FILTER写法 =
SUMX ( FILTER ( VALUES ( '示例'[名字] ), '示例'[名字] <> "奖金" ), [工资聚合] [应分奖金] )
结果:
这种是利用FILTER VALUES函数构建了一个没有奖金项目的虚拟表,最后利用SUMX汇总。
方法二:
代码语言:txt复制实发工资SUMMARIZE写法 =
SUMX ( SUMMARIZE ( '示例', '示例'[名字] ), IF ( '示例'[名字] <> "奖金", [工资聚合] [应分奖金] ) )
结果:
这是利用SUMMARIZE函数搭配IF的使用方法。最后利用SUMX函数汇总。
这里白茶说一下两段代码的区别:
FILTER是在构建表的时候,就将“奖金”这个项目踢出去了。最后SUMX汇总是根据表汇总的,表中都没有“奖金”这一项,那么后面的结果也当然没有了。
SUMMARIZE函数,是先判断后面的计算值的,如果IF的判断为空的话,那么虚拟表就没有这一项,因为它只显示可见组合。最后SUMX汇总可见项。
二者一个是从表出发,一个是从结果出发,结果都是一样的。
小伙伴们,GET了么?
(BOSS:好!漂亮!)