DAX Calculate实战:如果帮助HR妹子整理考勤表

每个月整理考勤记录几乎都会让HR妹子暴走不已,除了打卡机偶尔抽风导致数据出错误外,最麻烦的恐怕就是要核对员工打卡记录信息了。虽然理论上每个员工每天只应该有两条打卡记录,上班一次,下班一次,但是实际情况下大家可能手抖,多打了几次卡,也可能上班或者下班时忘记了打卡,这就导致数据出现了重复或缺失,不可能直接生成报表使用。

为了解除HR妹子每个月手动核对成百上千条数据的苦恼,可以利用Power BI对数据进行整理。假设下表是打卡机生成的原始记录,可以看得里面员工打卡信息有重复和遗漏的情况。

这里写图片描述

首先用DAY函数将打卡时间中的日期分离出来以便按照日期对打卡记录进行整理。
这里写图片描述
接下来处理重复信息。先确定考核基准,认定员工最早一次打卡时间为有效的上班时间,最晚一次打卡的时间为有效下班时间。我们可以新创建两个计算列,用来计算当前员工最早一次和最晚一次打卡时间。

要计算最早时间可以使用下列公式进行:
这里写图片描述

这里面CALCULATE函数是用来对数据进行过滤处理,里面调用了两个函数:FIRSTNONBLANK和ALLEXCEPT。

FIRSTNONBLANK函数隶属于智能时间函数组,其意义是返回列中经其内调用表达式过滤后具有非空白值的第一个值。使用方法为:

FIRSTNONBLANK(<column>,<expression>)

这里面Column是指要查找计算的列,expression位置是填写用来对该列进行过滤的表达式。我们在公式里面是用FIRSTNONBLANK计算Records[Time]这一列中第1个出现的时间。

ALLEXCEPT是筛选函数组下面的一个公式,其目的是返回表中除受到指定的列筛选器影响的那些行之外的所有行。使用格式为:

ALLEXCEPT(<table>,<column>[,<column>[,…]])

这其中table指的是要做过滤的表名,column处填写的是要保留不做过滤的列名。我们调用ALLEXCEPT是对原始数据去除除了ID和Day以外所有过滤条件,目的是给外层CALCULATE函数返回一个筛选条件,即按照相同ID和Day相同的数据进行比对的以获取FIRSTNONBLANK的时间。

这样,通过CALCULATE,FIRSTNONBLANK以及ALLEXCEPT三个函数计算后就可以获得每个员工当天第最早的一次打卡时间。同理,将FIRSTNONBLANK换成其对应的LASTNONBLANK,就可以获得员工当天最后一次打卡时间。
这里写图片描述

处理处理完毕之后可以在报表页面新建一个表(透视表),将数据更加清晰的显示出来。
这里写图片描述

近一步的,我们还可以添加一个列用来记录那些员工缺少打卡信息:

Missing_Record = IF(Records[First_Record]=Records[Last_Record],"Yes","No")

还可以再添加一个列记录那些员工是在18点之后打卡的,以便找出加班工作的员工。

Overtime_Work = IF(HOUR(Records[Last_Record])>=18,"Yes","No")

当然还可以用下列公式统计一下每天8点半以后打卡,算作迟到的员工记录:

Arrive_Late = IF(HOUR(Records[First_Record])>=8&&MINUTE(Records[First_Record])>=30,"Yes","No")

整理好表单之后,这样我们就获得了一个比较干净全面的员工打卡记录,之后可以在该表的记录上创建报表,显示每个月员工的工作情况。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/jessica_seiya/article/details/79958284