8.6 多行转多行

 

多行转多行,多条记录合并计算,生成多条记录。
如根据打卡记录,整理员工每日的外出数据。在日常考勤信息表中,每卡每天有 7 条数据:

Per_Code in_out Date Time Type
1110263 1 2013-10-11 09:17:14.0000000 In
1110263 6 2013-10-11 11:37:00.0000000 Break
1110263 5 2013-10-11 11:38:21.0000000 Return
1110263 0 2013-10-11 11:43:21.0000000 NULL
1110263 6 2013-10-11 13:21:30.0000000 Break
1110263 5 2013-10-11 14:25:58.0000000 Return
1110263 2 2013-10-11 18:28:55.0000000 Out

这 7 条数据为一组,想要转换成如下结果:

Per_Code Date In Out Break Return
1110263 2013-10-11 9:17:14 18:28:55 11:37:00 11:38:21
1110263 2013-10-11 9:17:14 18:28:55 13:21:30 14:25:58

虽然转置后的表结构是可以确定的,但是用 pivot 实现起来会很复杂。这时可以先创建目标数据结构,再填充数据。

脚本:

A
1 =connect(“db”).query@x(“select * from DailyTime order by Per_Code,Date,Time”)
2 =create(Per_Code,Date,In,Out,Break,Return)
3 =A1.group((#-1)\7)
4 =A3.conj([~.Per_Code,~.Date]|~.(Time).m([1,7,2,3])|[~.Per_Code,~.Date]|~.(Time).m([1,7,5,6]))
5 >A2.record(A4)

A1 查询数据并按人员编号、日期和时间排序。
A2 创建结果序表。
A3 每 7 条记录分为一组。
A4 每组取出第 1、7、2、3、1、7、5、6 条记录,就是有序的全天记录,全部整理到一个序列中。
A5 将数据添加到 A2 创建的序表中。