
PIVOTBY 是 Excel 365/2021 及后续版本新增的动态数组函数,用于快速创建动态透视表,无需手动插入传统数据透视表,直接通过公式生成可自动溢出的透视结果,支持灵活的行列分组、聚合计算与筛选。相比传统透视表,PIVOTBY 更轻量化,可与其他函数嵌套使用。
一、函数核心语法与参数说明
1. 完整语法
PIVOTBY(rows, cols, values, [agg], [row_total], [col_total], [filter_array], [drop_empty])
2. 参数逐义解析
| 参数名 |
必选/可选 |
数据类型 |
核心作用 |
注意事项 |
rows |
必选 |
单元格区域/数组 |
行标签数据源:用于分组的行维度字段(可单字段/多字段) |
多字段需用 HSTACK 合并,如 HSTACK(部门, 季度) |
cols |
必选 |
单元格区域/数组 |
列标签数据源:用于分组的列维度字段(可单字段/多字段) |
多字段需用 HSTACK 合并,支持空值("")表示无列分组 |
values |
必选 |
单元格区域/数组 |
值区域数据源:需要聚合计算的数值字段 |
区域行数必须与 rows/cols 完全一致 |
[agg] |
可选 |
文本/函数 |
聚合方式:默认 SUM,支持内置函数或自定义 LAMBDA 函数 |
内置值:SUM/COUNT/COUNTA/AVERAGE/MIN/MAX/MEDIAN 等 |
[row_total] |
可选 |
逻辑值/文本 |
行总计开关:是否添加行总计行 |
TRUE=显示总计(默认名称“总计”);"自定义名称"=自定义总计标题;FALSE=不显示 |
[col_total] |
可选 |
逻辑值/文本 |
列总计开关:是否添加列总计列 |
规则同 row_total |
[filter_array] |
可选 |
布尔数组 |
筛选条件:按行筛选数据源,仅保留 TRUE 对应的行 |
数组行数必须与数据源一致,可结合 FILTER 函数生成筛选条件 |
[drop_empty] |
可选 |
逻辑值 |
空值过滤:是否删除无数据的行/列 |
TRUE=删除空行列(默认);FALSE=保留空行列 |
3. 关键特性
- 动态溢出:公式输入后自动向下、向右溢出结果,无需手动拖拽填充。
- 自动更新:数据源变化时,结果实时刷新(需开启 Excel 自动计算)。
- 兼容性:仅支持 Excel 365/2021 及以上版本,低版本需用传统透视表替代。
二、数据源准备(通用示例数据)
为统一示例,使用销售数据表作为基础数据源,共 6 行数据:
| 单元格区域 |
A (部门) |
B (季度) |
C (销售额) |
D (利润) |
| 1 |
销售部 |
Q1 |
10000 |
2000 |
| 2 |
销售部 |
Q2 |
12000 |
2500 |
| 3 |
技术部 |
Q1 |
8000 |
1500 |
| 4 |
技术部 |
Q2 |
9000 |
1800 |
| 5 |
市场部 |
Q1 |
5000 |
1000 |
| 6 |
市场部 |
Q2 |
2000 |
300 |
后续所有示例均基于此表,数据区域记为 A1:D6。
三、初级用法:基础单维度透视
场景1:单一行标签 + 单一列标签 + 单值聚合
需求:按「部门」分组(行),按「季度」分组(列),统计销售额总和。
公式编写
=PIVOTBY(A2:A6, B2:B6, C2:C6, "SUM")
参数对应说明
| 参数 |
取值 |
作用 |
rows |
A2:A6 |
行标签:部门(销售部/技术部/市场部) |
cols |
B2:B6 |
列标签:季度(Q1/Q2) |
values |
C2:C6 |
值区域:销售额 |
[agg] |
"SUM" |
聚合方式:求和(默认可省略) |
溢出结果
|
Q1 |
Q2 |
| 销售部 |
10000 |
12000 |
| 技术部 |
8000 |
9000 |
| 市场部 |
5000 |
2000 |
场景2:无列标签(仅行维度聚合)
需求:按「部门」分组,统计总销售额,不按列拆分。
公式编写
=PIVOTBY(A2:A6, "", C2:C6)
关键参数:cols=""
表示不设置列标签,结果仅输出「行标签+聚合值」两列。
溢出结果
|
销售额 |
| 销售部 |
22000 |
| 技术部 |
17000 |
| 市场部 |
7000 |
四、中级用法:多维度分组与总计配置
场景1:多行/多列标签 + 多值聚合
需求:按「部门+季度」双行标签,无列标签,同时统计销售额总和和利润总和。
公式编写
=PIVOTBY(HSTACK(A2:A6, B2:B6), "", HSTACK(C2:C6, D2:D6), "SUM")
参数核心技巧
rows 用 HSTACK(部门, 季度) 实现多行标签;
values 用 HSTACK(销售额, 利润) 实现多值聚合;
- 聚合方式
SUM 同时作用于两个值字段。
溢出结果
|
|
销售额 |
利润 |
| 销售部 |
Q1 |
10000 |
2000 |
| 销售部 |
Q2 |
12000 |
2500 |
| 技术部 |
Q1 |
8000 |
1500 |
| 技术部 |
Q2 |
9000 |
1800 |
| 市场部 |
Q1 |
5000 |
1000 |
| 市场部 |
Q2 |
2000 |
300 |
场景2:添加行/列总计
需求:按「部门」行标签、「季度」列标签统计销售额,同时显示行总计和列总计,自定义总计名称为「合计」。
公式编写
=PIVOTBY(A2:A6, B2:B6, C2:C6, "SUM", "合计", "合计")
参数说明
row_total="合计":行总计标题为「合计」;
col_total="合计":列总计标题为「合计」。
溢出结果
|
Q1 |
Q2 |
合计 |
| 销售部 |
10000 |
12000 |
22000 |
| 技术部 |
8000 |
9000 |
17000 |
| 市场部 |
5000 |
2000 |
7000 |
| 合计 |
23000 |
23000 |
46000 |
场景3:保留空行列(drop_empty=FALSE)
需求:若数据源存在无数据的分组(如“市场部 Q3”),保留空行显示。
扩展数据源
在原数据后添加一行:A7=市场部, B7=Q3, C7=""(销售额为空)。
公式编写
=PIVOTBY(A2:A7, B2:B7, C2:C7, "SUM", , , , FALSE)
关键参数:drop_empty=FALSE
强制保留无数据的行列,空值显示为 0。
溢出结果(新增Q3列)
|
Q1 |
Q2 |
Q3 |
| 销售部 |
10000 |
12000 |
0 |
| 技术部 |
8000 |
9000 |
0 |
| 市场部 |
5000 |
2000 |
0 |
五、高级用法:筛选、自定义聚合与函数嵌套
场景1:结合筛选条件(filter_array)
需求:仅统计销售额>6000的记录,按部门和季度透视销售额总和。
公式编写
=PIVOTBY(A2:A6, B2:B6, C2:C6, "SUM", , , C2:C6>6000)
参数核心:filter_array=C2:C6>6000
- 生成布尔数组:
{TRUE,TRUE,TRUE,TRUE,FALSE,FALSE};
- 仅保留数组中
TRUE 对应的行(即销售额>6000的记录)。
筛选后数据源(实际参与计算的行)
| 部门 |
季度 |
销售额 |
| 销售部 |
Q1 |
10000 |
| 销售部 |
Q2 |
12000 |
| 技术部 |
Q1 |
8000 |
| 技术部 |
Q2 |
9000 |
最终溢出结果
|
Q1 |
Q2 |
| 销售部 |
10000 |
12000 |
| 技术部 |
8000 |
9000 |
场景2:自定义聚合函数(LAMBDA 实现非内置计算)
需求:按部门分组,计算销售额的标准差(内置聚合无此函数,需自定义)。
公式编写
=PIVOTBY(A2:A6, "", C2:C6, LAMBDA(x, STDEV.S(x)))
参数核心:agg=LAMBDA(x, STDEV.S(x))
x 代表每个分组的数值集合(如销售部的 {10000,12000});
STDEV.S(x) 计算样本标准差,可替换为任意自定义逻辑(如 MAX(x)-MIN(x) 计算极差)。
溢出结果
|
销售额标准差 |
| 销售部 |
1414.21 |
| 技术部 |
707.11 |
| 市场部 |
2121.32 |
场景3:与 SORT 嵌套,对透视结果排序
需求:按部门透视总销售额,并按销售额降序排序。
公式编写
=SORT(PIVOTBY(A2:A6, "", C2:C6), 2, -1)
嵌套逻辑
- 先用
PIVOTBY 生成基础透视结果(2列:部门+销售额);
- 再用
SORT 函数按第2列(销售额) 降序(-1)排序。
排序后结果
|
销售额 |
| 销售部 |
22000 |
| 技术部 |
17000 |
| 市场部 |
7000 |
六、常见问题与注意事项
-
溢出错误 #SPILL!
- 原因:结果区域被其他单元格内容阻挡;
rows/cols/values 行数不一致。
- 解决:清空结果区域的空单元格;检查数据源区域行数是否匹配。
-
聚合函数不生效
- 原因:
agg 参数拼写错误(如 "Sum" 写成 "sum" 不影响,但需避免错别字);自定义 LAMBDA 函数语法错误。
- 解决:核对内置聚合函数名称;调试
LAMBDA 函数逻辑。
-
多字段分组顺序问题
- 技巧:
HSTACK(字段1, 字段2) 中,字段1是外层分组,字段2是内层分组,顺序决定透视结果的层级。
-
性能优化
- 当数据源超过1万行时,避免使用复杂自定义聚合;
- 先用
FILTER 筛选目标数据,再传入 PIVOTBY,减少计算量。