如何在QUERY()函数结果中按ORDER NO分组添加小计?
Google Sheets 按ORDER NO分组并添加QTY小计
问题描述
使用公式 =QUERY(SIPARISLER; "select C, D, E, F where G = 'KESİN' order by C DESC"; 1) 获取了包含FIRMA、ORNER NO、BCE NO、QTY字段的表格数据,需要按ORDER NO(对应原数据的ORNER NO)分组,在每组数据后添加该组的QTY小计,生成指定格式的输出表格。
输入数据
| + | A | B | C | D |
|---|---|---|---|---|
| 1 | FIRMA | ORNER NO | BCE NO | QTY |
| 2 | SLP | 231561 | 30-129 | 50 |
| 3 | SLP | 231561 | 30-302 | 30 |
| 4 | SLP | 231784 | 30-116 | 100 |
| 5 | OFM | 312 | 30-123 | 3 |
| 6 | DELTA | 233391 | 60-120 | 6 |
期望输出
| + | A | B | C | D |
|---|---|---|---|---|
| 1 | FIRMA | ORDER NO | BCE NO | QTY |
| 2 | SLP | 231561 | 30-129 | 50 |
| 3 | SLP | 231561 | 30-302 | 30 |
| 4 | SUBTOTAL | 80 | ||
| 5 | SLP | 231784 | 30-116 | 100 |
| 6 | SUBTOTAL | 100 | ||
| 7 | OFM | 312 | 30-123 | 3 |
| 8 | SUBTOTAL | 3 | ||
| 9 | DELTA | 233391 | 60-120 | 6 |
| 10 | SUBTOTAL | 6 |
解决方案
直接在单元格中输入以下公式即可实现需求:
=ARRAYFORMULA( LET( data, QUERY(SIPARISLER; "select C, D, E, F where G = 'KESİN' order by C DESC"; 1); headers, INDEX(data; 1; ); rows, INDEX(data; 2:ROWS(data); ); orderNos, INDEX(rows; ; 2); uniqueOrders, UNIQUE(orderNos); result, REDUCE(headers; uniqueOrders; LAMBDA(acc; order; LET( group, FILTER(rows; orderNos = order); subtotal, {"SUBTOTAL"; ""; ""; SUM(INDEX(group; ; 4))}; VSTACK(acc; group; subtotal) ) )); result ) )
公式说明
LET函数:定义变量简化结构,避免重复计算data:存储原始QUERY返回的完整数据(含表头)headers:提取表头行rows:提取除表头外的所有数据行orderNos:提取所有用于分组的ORNER NO字段值uniqueOrders:获取不重复的ORNER NO列表
REDUCE函数:遍历每个唯一分组值,逐步构建结果- 用
FILTER筛选当前分组的所有数据行 - 计算该组QTY总和,生成小计行
- 用
VSTACK将累计结果、当前分组数据、小计行堆叠
- 用
- 最终输出:
result变量存储带小计的完整表格
注意事项
- 需使用支持
REDUCE、LAMBDA、VSTACK的新版Google Sheets - 若原始
QUERY的列对应关系变更,需调整INDEX中的列索引(如INDEX(rows; ; 2)对应ORNER NO列,INDEX(group; ; 4)对应QTY列)
内容的提问来源于stack exchange,提问作者Gökhan Ton
相关产品推荐
相关产品推荐

