PIVOTBY函数是Excel中用于数据透视的强大工具,允许用户通过指定行、列字段对数据进行分组、聚合和筛选。基本语法:
PIVOTBY(row_fields, col_fields, values, function, [field_headers], [row_total_depth],[row_sort_order],[col_total_depth], [col_sort_order], [filter_array], [relative_to])
必选参数:
row_fields(必需):用于行分组的字段区域。
col_fields(必需):用于列分组的字段区域。
values(必需):需要聚合的数值区域。
function(必需):聚合函数(如求和、平均值、计数),定义如何处理值字段。
可选参数:
field_headers:决定是否包含字段标题(0/1/2/3)。
row_total_depth:是否显示行总计(0为不显示,1为显示总计)。
row_sort_order:行排序方式(升序/降序)。
col_total_depth:是否显示列总计。
col_sort_order:列排序方式。
filter_array:筛选条件,如日期范围。
relative_to:参考方式(通常用于百分比计算)。
简单的理解,pivotby()函数可以将数据从一维表的格式转换成二维表的格式,何谓一维表,何谓二维表?以下面截图为例 ,上半部分是一维表,每一行数据代表一个记录,下半部分则是二维表,它是一个矩阵的结构,有行字段,有列字段,行字段和列字段交叉的地方则是对应的数据。
我们一般使用数据透视表将源数据从一维表变成二维表,但是现在pivotby()函数可以直接实现这个功能,如下面的公式:
=PIVOTBY(A1:B7,C1:C7,D1:D7,SUM,1,0,,0)
像Groupby()函数一样,Pivotby()可以同时支持多个聚合函数:
PIVOTBY(A1:B7,C1:C7,D1:D7,HSTACK(SUM,AVERAGE),1,0,,0)
Pivotby()函数可以添加筛选条件:
=PIVOTBY(A1:B7,C1:C7,D1:D7,HSTACK(SUM,AVERAGE),1,0,,0,,B1:B7="白色")
如果反过来,我们要从二维表转换成一维表,如何操作?目前为止,还没有逆透视函数,当然我们可以使用内置于EXCEL的Power query(以后会详细介绍),本文主要从组合公式的角度根据不同的情况,提供不同的解决方案。
方法1:使用groupby+if{1,0}组合,这个适用于比较标准的二维表。
该方法在上一往篇文章中已经有过介绍。
=IFERROR(GROUPBY(H2:I5,--J2:L5,IF({1,0},SINGLE,TOCOL(J1:L1)),,0),"")
略微不同的是嵌套了Iferror()函数,将错误值替换为空单元格。
如果要在上述公式的基础上只保留含有数值的,则可以嵌套filter()函数,在LET()函数当中,将groupby()函数的结果定义为变量a,然后用filter()函数添加筛选条件:最后一列不等于空,对应的公式则是
FILTER(a,TAKE(a,,-1)<>"")
TAKE(a,,-1)是提取参数a所代表数据的最后一列,详细的可以参考以前的文章:Take函数/Drop函数:选取指定行/列(连续)
当然也可以使用choosecols()函数,不过它的公式更长。
完整的公式:
=LET(a,IFERROR(GROUPBY(H2:I5,--J2:L5,IF({1,0},SINGLE,TOCOL(J1:L1)),,0),""),FILTER(a,TAKE(a,,-1)<>""))
方法2:使用TOCOL函数3次+HSTACK函数
以其中一个TOCOL函数为例:
TOCOL(IF(B2:G6="",N,B1:G1),3)
它就是将数据区域B2:G6中的各值进行判断,如果是空的,则返回错误值,非空的,则返回对应的B1:G1,最后嵌套TOCOL函数,记得第2参数是“3”,利用它的特性将空值,错误值剔除掉, 这个方法在后面也是反复利用到。
方法3:HSTACK+(TOCOL+(WRAPROWS+TOCOL))
以下面动图所示,这是一个不标准的二维表,因为列字段有多个重复的,现在要将相同字段的内容纵向合并在一起。
同方法2类似,不同的是对于数据的处理,先用TOCOL函数将其转换为列,然后再用WRAPCOLS()函数将其转换成2行(因为列字段里只有两种:“人员”,“体重”)。完整的公式:
=VSTACK(A1:C1,
HSTACK(TOCOL(IF(B2:K4,A2:A4),2),
WRAPROWS(TOCOL(B2:K4),2)))
方法3:使用REDUCE+LAMBDA,里面嵌套VSTACK+CHOOSECOLS
还是上面的例子,这里使用另外的思路:要输出的最终结果是3列(“分组”,“人员”,“体重”),其中第一列是固定的,后面两列是变动的,但是有很强的规律性,要提取源数据中的列:
分组 人员 体重
第1列,第2列,第3列,
第1列,第4列,第5列,
第1列,第6列,第7列...
每次提取当中,人员列和体重列是相邻的,间隔为1,下一次提取中,比如“人员”列,它提取的列数同上一次相比间隔为2。
因此可以使用reduce()遍历函数,遍历数组row(1:5)*2, 提取的列可以概括为:CHOOSECOLS(a,1,y,y+1), 完整公式为:
=LET(a,A2:K4,
REDUCE(A1:C1,ROW(1:5)*2, LAMBDA(x,y,VSTACK(x,CHOOSECOLS(a,1,y,y+1)))))
方法4:Reduce+if{1,0}+textsplit+offset
这主要适用于文字型二维表,详细的可以参看以前的文字。

