大数跨境
0
0

数据透视可以用pivotby函数,逆透视该用什么函数?

数据透视可以用pivotby函数,逆透视该用什么函数? Excel Plus---不止是Excel
2025-10-20
2

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()函数来转换,然后用HSTACK()将其横向连接。如果要加上表头,则要嵌套一个VSTACK()函数。

以其中一个TOCOL函数为例:

TOCOL(IF(B2:G6="",N,B1:G1),3)

它就是将数据区域B2:G6中的各值进行判断,如果是空的,则返回错误值,非空的,则返回对应的B1:G1,最后嵌套TOCOL函数,记得第2参数是“3”,利用它的特性将空值,错误值剔除掉, 这个方法在后面也是反复利用到。

用Tocol()函数剔除数组中的错误值,还有哪些办法?

方法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

这主要适用于文字型二维表,详细的可以参看以前的文字。

如何恢复到同类项合并前的状态?
=REDUCE(A1:B1,A2:A3,LAMBDA(x,y,VSTACK(x,HSTACK(
IF({1,0},y,TEXTSPLIT(OFFSET(y,,1),,"、"))))))

【声明】内容源于网络
0
0
Excel Plus---不止是Excel
分享20年外企供应链工作经验中关于EXCEL函数,公式,数组, VBA编程, PYTHON编程, POWER BI, POWER AUTOMATE, R语言编程等方面的实操以及技巧。
内容 44
粉丝 0
Excel Plus---不止是Excel 分享20年外企供应链工作经验中关于EXCEL函数,公式,数组, VBA编程, PYTHON编程, POWER BI, POWER AUTOMATE, R语言编程等方面的实操以及技巧。
总阅读37
粉丝0
内容44