对账 SQL 怎么写提示词(两张表核对差异:这边有那边没有、金额或状态不一致、按日汇总差异定位)

要核对两份数据是否一致(自家订单与支付平台账单、数仓与业务库、迁移前后的新旧表、两个系统的库存)时用:AI 先确定比对的键和字段、统一口径,再写出找出「只在 A 有」「只在 B 有」「两边都有但不一致」三类差异的 SQL,并给出先汇总后明细的定位方法和差异报告格式。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
你是一名做过大量财务对账和数据迁移校验的数据工程师。请帮我写对账 SQL。

- 对账场景:[对账场景](例:我方订单表与支付平台下载的日账单核对)
- 表 A 的结构与含义:[表 A 结构]
- 表 B 的结构与含义:[表 B 结构]
- 两边的关联键:[关联键](例:我方的支付流水号对应账单中的商户订单号)
- 需要比对的字段:[比对字段](例:金额、状态、支付时间)
- 数据库:[数据库]
- 已知的口径差异:[口径差异](例:账单金额单位为元,我方为分;账单按北京时间日切)

请按以下步骤:
1. 口径统一:列出两边需要转换后才能比较的地方(单位、时区与日切时间、状态码映射、退款是单独一行还是冲减、手续费是否包含),在 SQL 中先做转换。
2. 先汇总:按日期(或其他维度)分别汇总两边的笔数和金额,找出差异出现在哪些日期,缩小排查范围。
3. 再明细:用全外连接(数据库不支持时用两次左连接加合并)找出三类差异:
   - 只在 A 存在;
   - 只在 B 存在;
   - 两边都存在但字段不一致(逐个字段比较,空值的比较要特别处理)。
   每条差异输出:关联键、差异类型、两边的值、差额。
4. 边界:跨日切的交易(例如我方 23:59:58 下单、平台次日 00:00:02 记账)如何处理——建议扩大一侧的时间窗口再比对,并单独标出这类「时间差」差异。
5. 关联键重复:先检查两边的关联键是否唯一,有重复时说明会造成什么误差以及如何处理。
6. 差异报告:汇总各类差异的笔数与金额,常见原因分类(时间差、掉单、重复、金额错误),以及需要人工处理的清单。
7. 定期执行:如何做成每天自动跑的任务,并在差异超过阈值时告警。

SQL 每一步加中文注释。

高亮处换成你自己的内容:[对账场景]、[表 A 结构]、[表 B 结构]、[关联键]、[比对字段]、[数据库]、[口径差异]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[已知的口径差异] 越详细越好,对账中八成的「差异」其实是口径不同(单位、时区、日切时间、退款记账方式),先统一口径,剩下的才是真正的问题。[关联键] 要写清两边分别是哪个字段。

常见坑:

  • 直接按自然日比对,日切时间附近的交易被分到不同的日期,每天都有一批「差异」,其实只是时间差。
  • 用内连接比对,只能发现「两边都有但不一致」的记录,掉单和多出来的记录全部漏掉。要用全外连接。
  • 字段比较时没有处理空值,空值和任何值比较的结果都不是「真」,差异被漏掉。

追问技巧:追问「把每天的对账结果写入一张差异表,并统计连续几天未处理的差异」,或「差异原因分类能不能自动判断,比如时间差和掉单」。

示例输出

示例,仅供参考(MySQL 不支持全外连接,用两次左连接合并,节选)
sql
WITH a AS (   -- 我方:金额从分转为元,按北京时间取日期
  SELECT pay_no AS k, pay_amount / 100 AS amt, status, DATE(paid_at) AS d
  FROM orders WHERE paid_at >= '2026-10-06' AND paid_at < '2026-10-07'
),
b AS (        -- 平台账单
  SELECT merchant_order_no AS k, amount AS amt, trade_status AS status, DATE(trade_time) AS d
  FROM bill_daily WHERE bill_date = '2026-10-06'
)
SELECT a.k, '金额或状态不一致' AS diff_type, a.amt AS a_amt, b.amt AS b_amt, a.amt - b.amt AS gap
FROM a JOIN b ON a.k = b.k
WHERE NOT (a.amt <=> b.amt) OR NOT (a.status <=> b.status)
UNION ALL
SELECT a.k, '只在我方', a.amt, NULL, a.amt FROM a LEFT JOIN b ON a.k = b.k WHERE b.k IS NULL
UNION ALL
SELECT b.k, '只在平台', NULL, b.amt, -b.amt FROM b LEFT JOIN a ON a.k = b.k WHERE a.k IS NULL;

说明:<=> 是 MySQL 中能正确比较空值的等号;状态码需要先映射为统一的取值再比较(此处省略映射)。「只在我方」中支付时间接近 23:59 的记录,建议到次日账单中再查一次,确认是否为时间差。

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~