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 创建的序表中。