组内再取满足条件的记录
【问题】
表一:
员工姓名 员工工号 刷卡时间
蔡燕 20513 2014-6-27 08:40:45
蔡燕 20513 2014-6-27 17:50:47
蔡燕 20513 2014-6-28 8:14:54
蔡燕 20513 2014-6-28 8:19:54
蔡燕 20513 2014-6-28 18:14:54
艾云东 11304 2014-06-27 16:40:50
艾云东 11304 2014-06-27 17:40:50
我筛选出每个员工,每天的上班情况,7 点到 12 点算上班打卡,16 点以后算下班打卡,多次刷卡取最早的打卡时间为上班卡,取最晚时间为下班卡,如果在该时间段未存在打卡记录即显示未打卡,8 点 30 之后打卡算迟到,18 点之前上班算早退吗,得出类似下表:
日期 员工姓名 上班 下班 是否迟到 是否早退
2014-6-27 秦燕 2014-6-27 08:40:45 2014-6-27 18:20:47 迟到早退
2014-6-27 艾云东未打卡 2014-06-27 17:40:50 未打卡早退
2014-6-28 秦燕 2014-6-28 8:14:54 2014-6-28 18:14:54
【回答】
这个逻辑并不困难,但判断比较多,很难在一句 SQL 里写出来,最好是在存储过程中分步完成,但还要取出首尾记录,用存储过程也不太方便。这个统计看起来应该是给人力或财务部门的考勤报表,可以试试用润乾集算报表来做,其中集成了强化计算的集算引擎,其脚本能方便地支持这种过程性运算,可以直接完成报表数据源计算,不必再写复杂的 SQL 或存储过程了。比如这个运算用 SPL 脚本只要按常规思路写出来就可以:
A |
B |
C |
|
1 |
$select * from 考勤表 order by 员工工号, 刷卡时间 |
||
2 |
=A1.group( 员工姓名,date(刷卡时间)) |
||
3 |
=create( 日期,员工姓名,上班,下班,是否迟到,是否早退) |
||
4 |
for A2 |
=A4(1). 刷卡时间 |
=string(time(B4)) |
5 |
=A4.m(-1). 刷卡时间 |
=string(time(B5)) |
|
6 |
=if(C4>="07:00:00" && C4<="12:00:00",B4," 未打卡") |
||
7 |
=if(C5>="16:00:00",B5," 未打卡") |
||
8 |
=if(C4>="08:30:00" && C4<="12:00:00"," 迟到", if(C4<="08:30:00","","未打卡")) |
||
9 |
=if(C5>="16:00:00"&& C5<="18:00:00"," 早退", if(C5>="18:00:00","","未打卡")) |
||
10 |
>A3.insert(0,date(A4. 刷卡时间),A4.员工姓名,B6,B7,B8,B9) |
||
11 |
result A3 |