AI 实用 06|AI 处理表格与数据:从"帮我算一下"到可核对的公式

核心原则:给它"数据长什么样",而不是"数据本身"

最常见的错误是把整张表贴进去。几千行数据会:烧光上下文、让模型抓不住重点、还可能因为太长而截断。

正确做法是给"结构描述":

表名:销售明细
行数:约 12,000 行
字段:
- 订单号 order_id (文本,格式 ORD-六位数字)
- 下单时间 created_at (日期,格式 2026-11-08 14:32:00)
- 部门 dept (文本,取值:华东/华南/华北/西南,可能有空值)
- 金额 amount (数值,单位元,两位小数)
- 状态 status (文本,取值:pending/paid/refunded)

样例 3 行:
ORD-000123 | 2026-11-08 14:32:00 | 华东 | 1299.00 | paid
ORD-000124 | 2026-11-08 15:10:22 | 华南 |  350.50 | pending
ORD-000125 | 2026-11-09 09:01:45 | 华东 | 2990.00 | refunded

这段"结构 + 样例"信息量足够,而 token 消耗只有几百。AI 处理表格的能力,80% 取决于你描述得准不准。

场景一:Excel 公式

提示模板

我在 Excel 里有一张表,数据在 A1:F12000。
A=订单号 B=日期 C=部门 D=金额 E=状态 F=备注
目标:在 G2 开始,按部门汇总"已支付"的金额。

要求:
- 用 SUMIFS,不要用数组公式
- 结果按部门去重列出,部门名放在 I 列,合计放 J 列
- 说明公式含义,每个参数对应哪个区域
- 给出如果我新增数据行,需要怎么调整范围

它会给:

=SUMIFS($D$2:$D$12000, $C$2:$C$12000, $I2, $E$2:$E$12000, "paid")

一定要让它解释参数。这样你能自己判断"条件区域和求和区域的顺序有没有搞反"——这是 SUMIFS 最常见的错误。

三类公式,需求要分开说

你要的 提示里该写
条件汇总 "用 SUMIFS,条件有 2 个:部门 + 状态"
跨表匹配 "用 XLOOKUP(不是 VLOOKUP),找不到时返回 '未匹配'"
动态筛选 "用 FILTER(Office 365 动态数组),返回整行"

明确指定函数版本很关键。你要 XLOOKUP,它却给了 INDEX+MATCH,虽然能用但维护起来累。

一个实用的追问

如果 C 列有空白单元格,上面的公式会怎么表现?会算进"空部门"吗?
给出处理办法。

AI 通常不会主动考虑空值。这一类追问,能提前发现 80% 的"数字对不上"问题。

场景二:SQL

提示模板

数据库:PostgreSQL 15
表结构:
orders(order_id text, created_at timestamptz, dept text, amount numeric(12,2), status text)

需求:统计 2026 年 10 月每个部门已支付订单的金额合计与订单数,
并按金额倒序。部门为空的行归入"未分配"。

要求:
- 用 CTE 结构,别写成三层嵌套
- 金额保留两位小数
- 说明时区处理方式
- 给出可能出现的性能问题

它会给出:

WITH base AS (
    SELECT
        COALESCE(NULLIF(TRIM(dept), ''), '未分配') AS dept,
        amount
    FROM orders
    WHERE status = 'paid'
      AND created_at >= '2026-10-01 00:00:00+08'
      AND created_at <  '2026-11-01 00:00:00+08'
)
SELECT dept,
       COUNT(*)                AS order_cnt,
       ROUND(SUM(amount), 2)   AS total_amount
FROM base
GROUP BY dept
ORDER BY total_amount DESC;

必须核对的三处:

  1. 时区。timestamptz 加时区偏移,否则统计范围会差 8 小时。
  2. 边界。用 >= 开始 和 < 下月 1 日,别用 <= 月末(会漏掉或算进边界数据)。
  3. 方言。MySQL 的 LIMIT、SQL Server 的 TOP、日期函数全不一样,提示里一定写明数据库。

让它自己审一遍

检查上面的 SQL:
- 有没有可能因为 NULL 导致分组丢失
- 有没有 index 用不上导致全表扫
- 如果 orders 有 5000 万行,这个查询要多久

场景三:Python 处理数据

用 pandas 处理一个 CSV(字段:order_id, created_at, dept, amount, status)。

任务:
1. 按 dept 汇总已支付订单的金额,空部门记为"未分配"
2. 计算每个部门 10 月环比 9 月的变化率,保留两位小数
3. 输出一个 Excel,两个 sheet:汇总、环比

约束:
- 完整可运行,不要省略
- 日期列先转 datetime,明确时区
- 金额用两位小数
- 注释只解释"为什么",不解释"是什么"

关键代码会类似:

import pandas as pd

df = pd.read_csv("sales.csv")
df["created_at"] = pd.to_datetime(df["created_at"])
df["dept"] = df["dept"].fillna("未分配").replace("", "未分配")

paid = df[df["status"] == "paid"].copy()
paid["month"] = paid["created_at"].dt.to_period("M")

monthly = (paid.groupby(["dept", "month"])["amount"]
             .sum()
             .round(2)
             .unstack(fill_value=0))

ratio = ((monthly["2026-10"] - monthly["2026-09"]) / monthly["2026-09"])
ratio = ratio.replace([float("inf")], None).round(2)

这里有个必查点:inf。上月为 0 时,环比会算出无穷大或直接抛错。AI 有时会漏掉这个处理,一定要问一句"基期为 0 怎么办"。

场景四:透视表和图表的"设计"

AI 在"生成计算"上很强,在"判断该看什么"上其实也能用:

我有一张销售表(字段如上),老板要一份"月度经营分析",只看一页。

请给出:
1. 应该做哪 3 个核心指标(说明为什么选这三个)
2. 每个指标用什么图表(柱状/折线/饼图,说明理由)
3. 一张透视表的结构:行、列、值、筛选各放什么

不要给代码,先给方案。

这类"先问方案再要实现",能避免它直接给你一张花哨但没信息量的图。

怎么验证 AI 算得对不对

这是最容易跳过、也最致命的一步。三个交叉验证:

1. 总量对得上

筛选后的总金额  = 原始总金额 − 被排除部分
行数:筛选后 + 被排除 = 原始

任何"分组汇总",先算总数,再看分组之和是否等于总数。差一分钱都要查清楚。

2. 抽样核对 3 行

随机挑 3 个案例,手工算一遍。这一步能抓到 90% 的公式错误(尤其是条件顺序搞反的)。

3. 边界单独测

  • 空值:dept 为空的行去哪了?
  • 零值:amount = 0 算不算进?
  • 重复:order_id 有没有重复,会不会重复计数?
  • 异常日期:有没有 2099 年这种脏数据?

常见坑,按出现频率排

坑 表现 对策
字段名对不上 它按猜的名字写公式 提示里贴真实表头
空值未处理 汇总少一块,且没人发现 显式问"空值怎么办"
日期是文本 排序、筛选全乱 先isinstance / 看格式,转成真日期
金额精度 差几分钱 用numeric(12,2) 或整数分,别用浮点累加
时区 月度统计差 8 小时 明确+08 或转 UTC 再算
编码 中文乱码 读入时指定encoding='utf-8-sig' / gbk
合并单元格 读数时缺行 先取消合并并填充
相对引用被拷错 公式下拉后错列 检查$ 绝对引用

关于隐私

表里有姓名、手机号、身份证、金额明细时,贴给 AI 之前先脱敏:

  • 手机号 → 138****8000
  • 姓名 → 张*
  • 身份证 → 前 6 位 + ******** + 后 4 位
  • 内部编码 → 替换成 A001、A002

大多数分析任务不需要真实值,结构 + 样例 + 统计特征就够了。把这张表换成"字段 + 类型 + 3 行假数据",AI 一样能给你正确的公式和代码。

一句话方法

处理表格时,把 AI 当成"懂语法但不知道你数据长什么样的同事":你负责把结构说清楚,它负责把语法写对,最后你负责抽查核对。这三件事不要混在一起做。