WPS中PIVOTBY函数的使用方法教程

频繁需要将单一维度数据表迅速转换为多维度数据管理模式,微数据处理带来了很多麻烦,为此,可利用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”,代表不显示“总计列”。

声明:本文来自互联网或用户投稿,该文观点仅代表作者本人,不代表本站立场。文章及其配图仅供学习和交流之用,版权归原作者所有,如有内容侵权或者其他违规问题,请联系本站处理。