金山WPS

关注公众号 jb51net

关闭
软件教程 > 办公软件 > 金山WPS >

将一维考勤表向二维透视! wps函数pivotby是一个超级透视表函数

脚本之家

网友求助SOS:如何将表①布局的考勤记录转换成表②布局的考勤记录。

对于财务部门或人力资源部门进行考勤统计工作,大多数情况下都是考勤机导出表②表格形式的记录,然后想方设法变成表①那样,他这个却是反过来的。为统计工作造成了一定的难度。

由于原表格数据量太大,我们简化数据源,用几组简单的数据还原真实的职场办公场景即可:

左侧为简单的一维格式的考勤数据,一列姓名,一列时间点,每行为一组一一对应的数据。我们要转换为右下侧二维格式的考勤数据,列标题为时间点,行标题为姓名,中间值区域为对应的个数不等的时间点记录。

日期时间序列号由整数部分(日期)和小数部分(时间)组成,例如:

我们今天讲的这个方法,不添加任何辅助列,只在一个单元格输入一组嵌套函数公式。这个公式通过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”,代表不显示“总计列”。

推荐阅读: