【n8n教程】:Summarize 节点,掌握数据聚合的魔法武器
在数据处理的世界中,你是否曾经遇到过这样的问题:需要统计销售员的总业绩?想要计算每个地区的总收入?或者需要汇总一堆散乱的数据?这些工作在 Excel 中通常需要使用数据透视表来完成,但在 n8n 中,我们有一个强大的工具来解决这一切——Summarize 节点。
Summarize 节点就像 Excel 中的数据透视表功能,它能够将多条数据进行聚合、分组和统计。无论你是初学者还是有一定经验的用户,这篇教程都将帮助你快速掌握这个强大的数据转换工具。
🎯 什么是 Summarize 节点?
Summarize 节点 是 n8n 中的一个数据转换工具,用于对输入数据进行聚合操作,类似于 Excel 的数据透视表或 SQL 中的 GROUP BY 语句。
核心功能:
- 数据聚合:将多条数据项合并成一条或多条汇总数据
- 分组统计:按照指定字段对数据进行分组
- 多种计算方式:支持求和、计数、平均值、最大值、最小值等
实际应用场景:
| 场景 | 示例 |
|---|---|
| 销售分析 | 按销售员统计总业绩 |
| 地区统计 | 按地区统计总销售额 |
| 数据清理 | 计算数据中的唯一值个数 |
| 数据整理 | 合并相同类别的项目 |
| 报表生成 | 自动生成周期性数据报表 |
🔧 Summarize 节点的关键参数
1. 字段聚合方法 (Fields to Summarize)
这是 Summarize 节点的核心,决定了如何对数据进行计算。n8n 提供了 8 种聚合方式:
📊 常用聚合方法详解:
① 计数 (Count)
- 统计数据项的总数量
- 最常见的聚合方式
- 示例:计算有多少条订单记录
② 求和 (Sum)
- 将数值字段相加
- 适用于数值类型的数据
- 示例:计算总销售额
③ 平均值 (Average)
- 计算数值字段的平均值
- 自动忽略非数值数据
- 示例:计算平均订单金额
④ 最大值 (Max) / 最小值 (Min)
- 找出最大或最小的数值
- 可用于找出性能最好或最差的数据
- 示例:找出最高和最低销售额
⑤ 连接 (Concatenate)
- 将多个文本值合并成一个字符串
- 可自定义分隔符(逗号、空格、换行符等)
- 选项:
Include Empty Values(是否包含空值) - 示例:将所有标签合并成一行文本
⑥ 追加 (Append)
- 将多个值收集到一个数组中
- 适合需要保留所有值的场景
- 选项:
Include Empty Values(是否包含空值) - 示例:收集某个类别下的所有项目
⑦ 计数唯一值 (Count Unique)
- 统计不重复的值的个数
- 自动去除重复
- 示例:统计有多少个不同的客户
2. 分组字段 (Fields to Split By)
用于定义如何对数据进行分组,类似于 Excel 数据透视表中的"行"字段或 SQL 的 GROUP BY 子句。
重要特性:
- 可以输入单个字段名称
- 支持多字段分组(用逗号分隔)
- 例如:
Sales Rep或Sales Rep, Region - 字段名称支持点号记法(访问嵌套字段)
应用示例:
假设你有这样的数据:
{ name: "Alice", department: "Sales", bonus: 1000 }
{ name: "Alice", department: "Sales", bonus: 1500 }
{ name: "Bob", department: "Marketing", bonus: 800 }
如果按 department 分组并对 bonus 求和,你会得到:
{ department: "Sales", sum_bonus: 2500 }
{ department: "Marketing", sum_bonus: 800 }
3. 节点选项 (Node Options)
🔄 输出格式 (Output Format)
这个选项决定了最终输出数据的结构方式:
选项 1:每个分组单独成一项 (Each Split in a Separate Item)
- ✅ 推荐用于:需要逐个处理每个分组的场景
- 输出:多条数据项,每条包含一个分组的结果
选项 2:所有分组在一项中 (All Splits in a Single Item)
- ✅ 推荐用于:需要统一处理所有分组的场景
- 输出:单条数据项,包含所有分组的结果
⚠️ 其他关键选项:
| 选项 | 说明 | 默认值 |
|---|---|---|
| 继续(若字段未找到) | 字段不存在时是否继续执行 | 关闭 |
| 禁用点号记法 | 是否禁用嵌套字段访问(parent.child) | 关闭 |
| 忽略不含分组字段的项 | 跳过未包含分组字段的数据项 | 开启 |
📸 节点界面详解
Summarize 节点在 n8n 工作流编辑器中的配置界面包含:
- 上方:字段聚合区域 - 添加和配置你要聚合的字段
- 中间:分组字段区域 - 定义数据分组的依据
- 下方:节点选项 - 调整输出格式和错误处理
💡 快速入门示例
示例 1:简单计数
场景:统计有多少条订单记录
输入数据:
[
{ "order_id": 1, "customer": "Alice" },
{ "order_id": 2, "customer": "Bob" },
{ "order_id": 3, "customer": "Alice" }
]
Summarize 配置:
- 聚合方法:
Count - 字段:
order_id
输出结果:
[
{ "count_order_id": 3 }
]
示例 2:按分类分组统计
场景:按客户统计他们的订单总数
输入数据:
[
{ "customer": "Alice", "amount": 100 },
{ "customer": "Alice", "amount": 200 },
{ "customer": "Bob", "amount": 150 }
]
Summarize 配置:
- 聚合方法:
Sum - 字段:
amount - 分组字段:
customer
输出结果:
[
{ "customer": "Alice", "sum_amount": 300 },
{ "customer": "Bob", "sum_amount": 150 }
]
示例 3:多个聚合操作
场景:按区域统计销售数据(计数、求和、求平均)
输入数据:
[
{ "region": "North", "sales": 5000 },
{ "region": "North", "sales": 7000 },
{ "region": "South", "sales": 4000 },
{ "region": "South", "sales": 6000 }
]
Summarize 配置:
- 聚合方法 1:
Count字段sales - 聚合方法 2:
Sum字段sales - 聚合方法 3:
Average字段sales - 分组字段:
region
输出结果:
[
{ "region": "North", "count_sales": 2, "sum_sales": 12000, "average_sales": 6000 },
{ "region": "South", "count_sales": 2, "sum_sales": 10000, "average_sales": 5000 }
]
示例 4:连接文本值
场景:将同一类别下的所有标签合并为一行
输入数据:
[
{ "product": "Laptop", "tag": "Electronics" },
{ "product": "Laptop", "tag": "Premium" },
{ "product": "Mouse", "tag": "Electronics" },
{ "product": "Mouse", "tag": "Budget" }
]
Summarize 配置:
- 聚合方法:
Concatenate - 字段:
tag - 分隔符:
,(逗号+空格) - 分组字段:
product
输出结果:
[
{ "product": "Laptop", "concatenate_tag": "Electronics, Premium" },
{ "product": "Mouse", "concatenate_tag": "Electronics, Budget" }
]
🚀 实战工作流案例:销售团队业绩分析
现在让我们构建一个完整的实际应用工作流,展示如何使用 Summarize 节点来分析销售团队的业绩数据。
工作流场景
一个销售团队有多名销售员,每月完成多笔交易。我们需要:
- ✅ 统计每个销售员的交易总数
- ✅ 计算每个销售员的总销售额
- ✅ 计算每个销售员的平均交易金额
- ✅ 找出最高和最低交易额
完整工作流代码
将以下代码复制到 n8n 的工作流编辑器中:
{
"nodes": [
{
"parameters": {},
"id": "2a3ff9ba-c72d-4f65-ba8d-85e5c6e2d1a0",
"name": "Start",
"type": "n8n-nodes-base.start",
"typeVersion": 1,
"position": [
50,
50
]
},
{
"parameters": {
"functionCode": "// 模拟销售数据\nreturn [\n { json: { sales_rep: 'Alice', deal_amount: 5000, deal_date: '2024-01-15' } },\n { json: { sales_rep: 'Alice', deal_amount: 3000, deal_date: '2024-01-20' } },\n { json: { sales_rep: 'Alice', deal_amount: 7000, deal_date: '2024-01-28' } },\n { json: { sales_rep: 'Bob', deal_amount: 4500, deal_date: '2024-01-10' } },\n { json: { sales_rep: 'Bob', deal_amount: 6000, deal_date: '2024-01-22' } },\n { json: { sales_rep: 'Charlie', deal_amount: 8000, deal_date: '2024-01-05' } },\n { json: { sales_rep: 'Charlie', deal_amount: 2000, deal_date: '2024-01-25' } },\n { json: { sales_rep: 'Charlie', deal_amount: 5500, deal_date: '2024-01-29' } }\n];"
},
"id": "7c9e1b3a-4d2e-4f5b-9a1c-2e3f4a5b6c7d",
"name": "生成销售数据",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
250,
50
],
"connections": {}
},
{
"parameters": {
"fields": [
{
"aggregation": "count",
"field": "deal_amount"
},
{
"aggregation": "sum",
"field": "deal_amount"
},
{
"aggregation": "average",
"field": "deal_amount"
},
{
"aggregation": "max",
"field": "deal_amount"
},
{
"aggregation": "min",
"field": "deal_amount"
}
],
"splitBy": "sales_rep",
"options": {
"outputFormat": "eachSplitInASeparateItem"
}
},
"id": "9f8e7d6c-5b4a-3f2e-1a9c-8b7a6f5e4d3c",
"name": "销售业绩汇总",
"type": "n8n-nodes-base.summarize",
"typeVersion": 1,
"position": [
500,
50
],
"connections": {}
},
{
"parameters": {
"functionCode": "// 将输出格式优化为更易读的形式\nreturn items.map(item => {\n return {\n json: {\n \"销售员\": item.json.sales_rep,\n \"交易总数\": item.json.count_deal_amount,\n \"总销售额\": `¥${item.json.sum_deal_amount.toFixed(2)}`,\n \"平均交易额\": `¥${item.json.average_deal_amount.toFixed(2)}`,\n \"最高交易额\": `¥${item.json.max_deal_amount}`,\n \"最低交易额\": `¥${item.json.min_deal_amount}`\n }\n };\n});"
},
"id": "3a2b1c0d-9e8f-7a6b-5c4d-3e2f1a0b9c8d",
"name": "格式化输出",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
750,
50
],
"connections": {}
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "生成销售数据",
"type": "main",
"index": 0
}
]
]
},
"生成销售数据": {
"main": [
[
{
"node": "销售业绩汇总",
"type": "main",
"index": 0
}
]
]
},
"销售业绩汇总": {
"main": [
[
{
"node": "格式化输出",
"type": "main",
"index": 0
}
]
]
}
}
}
工作流执行步骤
-
第一步:启动工作流 → 从"Start"节点开始
-
第二步:生成销售数据 → "生成销售数据"节点创建样本数据,包含:
- 销售员名字(Alice、Bob、Charlie)
- 交易金额
- 交易日期
-
第三步:数据聚合 → "销售业绩汇总"节点执行以下操作:
- 按销售员名字分组
- 对每个销售员统计:交易总数、总销售额、平均交易额、最高额、最低额
-
第四步:格式化输出 → "格式化输出"节点美化展示格式
预期输出结果
销售员: Alice
交易总数: 3
总销售额: ¥15,000.00
平均交易额: ¥5,000.00
最高交易额: ¥7,000
最低交易额: ¥3,000
销售员: Bob
交易总数: 2
总销售额: ¥10,500.00
平均交易额: ¥5,250.00
最高交易额: ¥6,000
最低交易额: ¥4,500
销售员: Charlie
交易总数: 3
总销售额: ¥15,500.00
平均交易额: ¥5,166.67
最高交易额: ¥8,000
最低交易额: ¥2,000
⚡ 常见问题与解决方案
❓ 问题 1:Summarize 节点找不到我指定的字段
原因:字段名称拼写错误或字段不存在
解决方案:
- ✅ 确认字段名称的准确拼写
- ✅ 如果是嵌套字段,使用点号记法:
parent.child - ✅ 在"节点选项"中开启"继续(若字段未找到)"选项
❓ 问题 2:聚合结果为空或不正确
原因:输入数据结构不符合预期或聚合逻辑配置错误
解决方案:
- ✅ 使用"执行步骤"按钮检查前一个节点的输出
- ✅ 验证是否有数据流进入 Summarize 节点
- ✅ 检查字段类型是否与聚合方法匹配(如数值类型与 Sum)
❓ 问题 3:多字段分组时结果不对
原因:分组字段顺序或配置错误
解决方案:
- ✅ 确认分组字段用逗号正确分隔:
field1, field2 - ✅ 检查分组字段的数据类型是否一致
- ✅ 在输出格式中选择"每个分组单独成一项"以便调试
❓ 问题 4:如何处理包含空值或缺失值的数据?
原因:数据不完整或包含 null 值
解决方案:
- ✅ 对于 Concatenate 和 Append,使用"Include Empty Values"选项
- ✅ 在 Summarize 前使用"Remove Duplicates"或"Filter"节点清理数据
- ✅ 使用"Set"节点为缺失值提供默认值
🎓 进阶技巧
💎 技巧 1:结合 SplitOut 处理嵌套数据
数据源 → SplitOut 节点 → Summarize 节点 → 最终输出
SplitOut 节点先将数组展开成多条数据项,然后 Summarize 进行聚合。
💎 技巧 2:链式聚合操作
在复杂场景中,你可以使用多个 Summarize 节点进行多层次的聚合:
原始数据 → 第一层 Summarize(按部门分组)
→ 第二层 Summarize(按公司分组)
→ 最终报表
💎 技巧 3:与其他节点结合
| 结合节点 | 应用场景 |
|---|---|
| HTTP Request | 从 API 获取数据,然后聚合 |
| Database | 从数据库查询后聚合统计 |
| Google Sheets | 从电子表格读取,聚合后写回 |
| If | 条件聚合(满足条件才聚合) |
| Code | 自定义聚合逻辑 |
🎯 总结
通过本教程,你已经学会了:
✅ 理解 Summarize 节点的核心概念 - 数据聚合和分组
✅ 掌握 8 种聚合方法 - Count、Sum、Average、Max、Min、Concatenate、Append、Count Unique
✅ 灵活使用分组功能 - 按单个或多个字段分组
✅ 配置输出格式 - 选择合适的数据结构
✅ 实现完整的工作流 - 从数据输入到结果输出
✅ 解决常见问题 - 处理错误和优化性能
Summarize 节点是 n8n 中最强大的数据转换工具之一。熟练掌握它,你将能够构建高效的数据处理工作流,大幅提高自动化的能力!
692

被折叠的 条评论
为什么被折叠?



