對帳 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 條評論

登入 後參與評論

還沒有評論,來搶沙發~