销售需求丨奖金权重分配法

2021-09-03 10:47:57 浏览数 (3)

白茶最近在和小伙伴沟通的时候,经常能遇到一些奇奇怪怪的需求,后来白茶仔细一合计,嗯,妥妥的中国式报表,满足!

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:好!漂亮!)

这里是白茶,一个PowerBI的初学者。

0 人点赞