先準備用來排查的資料
001 只在各供應商內唯一。只用發票號連接,會產生看似有紀錄、實際屬另一供應商的配對。兩個識別欄位都要用;金額是在配對後核對,不應拿來代替供應商編號。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 供應商 | 發票號 | 金額(分) |
|---|---|---|
| A | 001 | 10000 |
| B | 001 | 20000 |
| 供應商 | 發票號 | 金額(分) |
|---|---|---|
| A | 001 | 10000 |
| B | 001 | 20000 |
CREATE TABLE intake(supplier TEXT,invoice_no TEXT,amount_cents INTEGER);
CREATE TABLE ledger(supplier TEXT,invoice_no TEXT,amount_cents INTEGER,PRIMARY KEY(supplier,invoice_no));
INSERT INTO intake VALUES ('A','001',10000),('B','001',20000);
INSERT INTO ledger VALUES ('A','001',10000),('B','001',20000);重現錯誤結果,再核對更正
SELECT i.supplier,i.amount_cents AS source_cents,l.supplier AS matched_supplier,l.amount_cents AS target_cents
FROM intake i JOIN ledger l ON l.invoice_no=i.invoice_no ORDER BY i.supplier,l.supplier;| 供應商 | 原金額(分) | 配對供應商 | 目標金額(分) |
|---|---|---|---|
| A | 10000 | A | 10000 |
| A | 10000 | B | 20000 |
| B | 20000 | A | 10000 |
| B | 20000 | B | 20000 |
SELECT i.supplier,i.amount_cents AS source_cents,l.supplier AS matched_supplier,l.amount_cents AS target_cents
FROM intake i JOIN ledger l ON l.invoice_no=i.invoice_no AND l.supplier=i.supplier ORDER BY i.supplier;| 供應商 | 原金額(分) | 配對供應商 | 目標金額(分) |
|---|---|---|---|
| A | 10000 | A | 10000 |
| B | 20000 | B | 20000 |
錯誤連接有四行,把 A 的 HK$100 配到 B 的 HK$200,也反過來配錯。更正後只有兩個合理配對。這不是缺少客戶主檔,而是資料都在,識別欄位卻不足,造成不存在的關聯。
套用前先測邊界及資料範圍
加入 C 的 001,卻未有入帳紀錄,不能借用 A 或 B 的配對。此處內連接不會列 C;聲稱全批已對帳前,須另查未配對項目。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO intake VALUES ('C','001',30000);| 供應商 | 原金額(分) | 配對供應商 | 目標金額(分) |
|---|---|---|---|
| A | 10000 | A | 10000 |
| B | 20000 | B | 20000 |
供應商識別資料須先對應一致;改名、貸項單及發票號更正要有各自規則。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。