跳至內容
Astera Technology

不同供應商都用同一發票號,報表會否配錯?

以供應商加發票號配對,避免不同供應商的同號發票混在一起。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

001 只在各供應商內唯一。只用發票號連接,會產生看似有紀錄、實際屬另一供應商的配對。兩個識別欄位都要用;金額是在配對後核對,不應拿來代替供應商編號。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:intake
供應商發票號金額(分)
A00110000
B00120000
下載可編輯 CSV ↓
假設輸入:ledger
供應商發票號金額(分)
A00110000
B00120000
下載可編輯 CSV ↓
可直接執行的完整測試資料
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;
實際執行的錯誤示範結果
供應商原金額(分)配對供應商目標金額(分)
A10000A10000
A10000B20000
B20000A10000
B20000B20000
下載可編輯 CSV ↓
更正後的 SQLite 查詢
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;
更正查詢的實際結果
供應商原金額(分)配對供應商目標金額(分)
A10000A10000
B20000B20000
下載可編輯 CSV ↓

錯誤連接有四行,把 A 的 HK$100 配到 B 的 HK$200,也反過來配錯。更正後只有兩個合理配對。這不是缺少客戶主檔,而是資料都在,識別欄位卻不足,造成不存在的關聯。

套用前先測邊界及資料範圍

加入 C 的 001,卻未有入帳紀錄,不能借用 A 或 B 的配對。此處內連接不會列 C;聲稱全批已對帳前,須另查未配對項目。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO intake VALUES ('C','001',30000);
改動後再執行更正查詢的實際結果
供應商原金額(分)配對供應商目標金額(分)
A10000A10000
B20000B20000
下載可編輯 CSV ↓

供應商識別資料須先對應一致;改名、貸項單及發票號更正要有各自規則。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源