AI 实操与核验 · 发布于 2026-10-12 · 更新于 2026-10-12

ChatGPT 合并 Excel 后金额变多了?先查重复键和关联粒度

两张表单独求和正常,合并后总额却变大,先检查同一条记录是否匹配了多行。金额被关联过程复制,与小数精度或模型算术失误不是同一个问题。本文四条合成订单的一对一来源标签练习,先拒绝重复和缺失关联,再允许按同口径复算;不把脚本通过写成模型成绩。

本文目录

先看结论

两侧关联键各自唯一本例约定一对一,不自动留第一行
编号集合两表一致列出左缺失、右额外
金额口径CNY 中的 paid非负、最多两位小数
关联验收行数与编号一起核对总额碰巧相同不够

合并表格前后核验的 5 个步骤

  1. 保留原文件并说明每行的粒度

    在副本上记录每张表的列名和数据行数。本例左表每个 order_id 表示一条订单,右表表示该订单唯一的来源标签,所以约定一对一。右表若是商品明细或多次访问,一对多可能完全合理,不能删掉正常明细来消除重复。

  2. 分别检查两侧关联键

    关联前检查唯一性。重复键、同键内容冲突先停止,不自行保留第一行;不能按金额相同直接删行。真实数据必须回查导出过程和字段含义,教学已知条件不能替代核查。

  3. 检查缺失匹配和额外编号

    本例两表编号集合必须相同。列出左表找不到标签的编号和右表多出的编号,有异常先停止,不补零、不猜测匹配。实际业务采用不同关联规则时,应先明确规则再改代码。

  4. 核对关联后的行数与明细

    输出输入行数、关联行数、纳入与排除编号,再计算同口径总额。少一笔又多一笔可能碰巧抵消,不能只把两次总数相同当作完整验收。

  5. 按明确金额和舍入规则独立复算

    本例仅统计 CNY 的 paid,排除 unpaid 与整笔 refunded,不计算部分退款、净收入或汇率。金额从原始字符串进入 Decimal;逐项舍入和合计后舍入须先确认,不让 AI 临时选择。

四条订单为什么变成五行?

AIXiamo(AI夏末)于 2026 年 10 月 12 日整理,本文由 AI 辅助起草与核对。全部数据为教学合成记录,不是客户案例;测试只运行本地脚本,没有调用 ChatGPT、订单系统或任何支付服务。

订单表只有四行,paid 为 S01、S02、S03;S04 为 unpaid。金额仅为本例的合成值,不代表实际商品价格。

order_id,currency,status,amount
S01,CNY,paid,0.10
S02,CNY,paid,0.20
S03,CNY,paid,10.00
S04,CNY,unpaid,8.00

右表重复标签会复制左表金额

来源标签中 S02 出现两行。直接按编号关联会得到五行,paid 合计变为 0.10 + 0.20 + 0.20 + 10.00 = 10.50;原左表同口径应为 10.30。多出的 0.20 来自行倍增,并非浮点尾差。

两行内容相同,也不能证明真实业务允许去重。本练习已知它是人为加入的重复标签;现实中可能是合法明细、导出重复或字段粒度错误,必须先核查。

order_id,source
S01,desktop
S02,mobile
S02,mobile
S03,desktop
S04,mobile

运行会拒绝异常的离线复算脚本

下载脚本、测试和三份 CSV 到独立练习目录,先阅读源码。脚本只依赖 Python 标准库,通过 csv.DictReader 读取字段,从原始字符串构造 Decimal,不改写输入文件。第一条命令返回 duplicate_key:channels:S02,退出码 2,不输出一个伪装有效的合计。

为继续教学,另外使用已知核对过的 channels-reviewed.csv;保留原始五行文件。第二条命令退出码 0,两表输入与关联均为四行,纳入 S01/S02/S03,排除 S04,paid_total 为 10.30。配套 20 项离线单元测试通过的是脚本声明的规则,不是模型测试。

脚本限制每表最多 10000 行、金额整数部分最多 16 位、CNY 单币种、金额最多两位小数。它不是任意 Excel、多币种、部分退款或净收入核算工具,字段合法也不能证明数据真实。

python3 verify_join.py orders.csv channels.csv
python3 verify_join.py orders.csv channels-reviewed.csv
python3 -m unittest test_verify_join.py

Decimal 不能替你选择舍入口径

从 Decimal("0.10") 构造保留十进制输入;先转成 float 再交给 Decimal,无法恢复原始字符串的语义。两项中间值 0.005 按 ROUND_HALF_UP 逐项舍入到分,合计为 0.02;先合计再舍入则为 0.01。须先确认业务采用哪一阶段,不能选择更像账单的结果。

这是一条独立费用示例,不改变主脚本最多两位小数的规则:订单金额 0.105 仍被拒绝,不会静默舍入。

from decimal import Decimal, ROUND_HALF_UP

values = [Decimal("0.005"), Decimal("0.005")]
per_row = sum((v.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
               for v in values), Decimal("0.00"))
at_total = sum(values).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(per_row, at_total)  # 0.02 0.01

可复制的 ChatGPT 表格关联要求

下面是本文的验收建议,不是平台保证。把字段和规则替换为经过确认的实际含义;遇到异常先核查,不为得到合计而删除证据。

在副本上分析,保留原始文件。
先列出读取的表、字段、行数及未读取范围。
确认每行统计粒度;本次按 order_id 一对一关联。
两侧键必须唯一且编号集合一致。
列出重复键、缺失匹配、额外编号;有异常先停止,不自动删重。
若证据表明是一对多关系,先说明并等待确认汇总口径。
只计 CNY 的 paid,排除 unpaid 与整笔 refunded,金额最多两位小数。
输出关联前后行数、纳入/排除编号和可独立复算代码。
不要把生成代码说成已经执行成功。

安全与事实检查

  • 每行的统计粒度和关联规则已确认。
  • 重复键、缺失匹配和额外编号没有被静默隐藏。
  • 行数、纳入与排除编号、同口径合计一起核对。
  • 金额从原始字符串读取,舍入方式与阶段已确认。
  • 合成脚本测试不是模型成绩,不使用真实客户数据公开演示。

常见问题

合并后金额变大,是 ChatGPT 算术不行吗?

不能仅凭总额判断。先看关联结果是否复制了行;本例多出的 0.20 来自重复匹配,而不是浮点尾差。换模型不能替代确认统计粒度和关联键。

同编号出现两次就应去重吗?

不一定。同编号可能代表正常的一对多明细,也可能有内容冲突。先核查定义与来源,不能用保留第一行掩盖问题。本文仅对明确的一对一来源标签练习拒绝重复。

总额一样就算通过吗?

不算完整验收。少一笔又多一笔可能抵消,仍要核对输入与关联行数、纳入和排除编号以及异常清单。

这个脚本能核算任意 Excel 文件吗?

不能。它处理固定列名的 CSV、一对一来源标签和简化 CNY 金额规则。工作表、公式、隐藏行、多币种、部分退款等须另行核验。

官方参考

产品功能、方案名称、用量与地区可用性以 OpenAI 当前官方页面为准。

AIXiamo 购买、交付与售后条件以对应实时商品页和原订单为准,不是上述官方文档的服务承诺。内容维护与纠错