将一维考勤表向二维透视! wps函数pivotby是一个超级透视表函数
脚本之家
网友求助SOS:如何将表①布局的考勤记录转换成表②布局的考勤记录。
对于财务部门或人力资源部门进行考勤统计工作,大多数情况下都是考勤机导出表②表格形式的记录,然后想方设法变成表①那样,他这个却是反过来的。为统计工作造成了一定的难度。
由于原表格数据量太大,我们简化数据源,用几组简单的数据还原真实的职场办公场景即可:
左侧为简单的一维格式的考勤数据,一列姓名,一列时间点,每行为一组一一对应的数据。我们要转换为右下侧二维格式的考勤数据,列标题为时间点,行标题为姓名,中间值区域为对应的个数不等的时间点记录。
- A列(A2:A8):员工姓名(张三、李四)
- B列(B2:B8):Excel日期时间序列号,格式如45778.32847。将B列设置单元格格式为数值后可查看。
日期时间序列号由整数部分(日期)和小数部分(时间)组成,例如:
- 45778→日期:2025-5-1
- 0.32847→时间:7:53
我们今天讲的这个方法,不添加任何辅助列,只在一个单元格输入一组嵌套函数公式。这个公式通过Excel的日期时间序列号的特性和数组运算实现了考勤数据的二维透视。
PIVOTBY函数类似于数据透视表功能。
函数总体结构:
=PIVOTBY(
A2:A8, // 行分类字段(员工姓名)
INT(B2:B8), // 列分类字段(日期部分)
MOD(B2:B8,1),// 待聚合值(时间部分)
LAMBDA(x, TEXTJOIN(CHAR(10),,TEXT(x,"h:mm"))), // 聚合函数
,0,,0// 参数占位(不显示总计行/列)
)
我们一步一步输入公式,理解作用过程。
输入公式:
=PIVOTBY(A2:A8,INT(B2:B8),,)
行分组
根据A2:A8的姓名进行纵向分组,形成张三、李四两行。
列分组
通过INT(B2:B8)提取日期(整数部分),将不同日期的考勤横向分组。
例如:45778对应2025-5-1,45779对应2025-5-2
实际效果中的日期,需要设置单元格格式为“m"月"d"日";@”才能正常显示。
完善公式参数:
=PIVOTBY(A2:A8,INT(B2:B8),MOD(B2:B8,1),)
待聚合值处理
MOD(B2:B8,1)提取时间(小数部分)。
由于目前还没有设置第4参数,第3参数的待聚合值要靠4参数的聚合函数实现,所以暂时显示错误值。
完善公式参数:
=PIVOTBY(A2:A8,INT(B2:B8),MOD(B2:B8,1),LAMBDA(x,TEXTJOIN(CHAR(10),,TEXT(x,"h:mm"))))
用LAMBDA函数设置第4参数,聚合函数。
LAMBDA函数定义第3参数的待聚合值为x
使用TEXT(x,"h:mm"):
将小数转换为标准时间格式(如0.328472→7:54)
使用TEXTJOIN(CHAR(10),...):
用换行符合并同一单元格内的多个时间。
动态数组工作原理:
公式自动检测行/列维度组合,例如:
张三在2025-5-1日有两次打卡(7:53和17:15)
公式会自动创建二维矩阵,交叉位置合并对应时间。
实际效果中的换行符(CHAR(10))需要单元格启用自动换行功能后才能正常显示。
实际效果中的时间,需要设置单元格格式为“h:mm;@”才能正常显示。
继续完善公式:
=PIVOTBY(A2:A8,INT(B2:B8),MOD(B2:B8,1),LAMBDA(x,TEXTJOIN(CHAR(10),,TEXT(x,"h:mm"))),,0)
设置第6参数为“0”,代表不显示“总计行”。
继续完善公式:
=PIVOTBY(A2:A8,INT(B2:B8),MOD(B2:B8,1),LAMBDA(x,TEXTJOIN(CHAR(10),,TEXT(x,"h:mm"))),,0,,0)
设置第8参数为“0”,代表不显示“总计列”。
推荐阅读: