组内再取满足条件的记录

【问题】

表一:

员工姓名  员工工号  刷卡时间  
蔡燕 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