跳至內容
Astera Technology

發票接上客戶資料後少了幾筆,怎樣找回漏項?

保留已發出的發票,找出接不到客戶主檔的編號,避免報表無聲漏項。

先訂清楚要判斷甚麼,再準備資料

內連接會刪走接不到客戶的發票。排查時用左連接,檢查客戶主鍵是否空值。不能只查客戶名稱,因為名稱漏填不等於客戶不存在。發票應留下覆核,不能為了湊齊總額便隨意新增客戶。

以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。

假設輸入節錄;完整相關資料見下方 SQL
編號客戶編號金額(分)狀態代碼
I1C1100000issued
I2C250000issued
I3C920000issued
I4C130000void
下載可編輯 CSV ↓
可直接執行的完整假設資料(SQLite)
CREATE TABLE customers(id TEXT PRIMARY KEY, name TEXT);
CREATE TABLE invoices(id TEXT PRIMARY KEY, customer_id TEXT, amount_cents INTEGER, due_on TEXT, status TEXT);
CREATE TABLE payments(id TEXT PRIMARY KEY, invoice_id TEXT, amount_cents INTEGER, status TEXT);
CREATE TABLE refunds(id TEXT PRIMARY KEY, payment_id TEXT, amount_cents INTEGER, status TEXT);
INSERT INTO customers VALUES ('C1','Acorn'),('C2','Birch');
INSERT INTO invoices VALUES ('I1','C1',100000,'2026-10-01','issued'),('I2','C2',50000,'2026-10-20','issued'),('I3','C9',20000,'2026-10-02','issued'),('I4','C1',30000,'2026-09-01','void');
INSERT INTO payments VALUES ('P1','I1',40000,'settled'),('P2','I1',20000,'settled'),('P3','I2',50000,'settled'),('P4','I3',20000,'failed');
INSERT INTO refunds VALUES ('R1','P1',10000,'completed'),('R2','P1',5000,'pending'),('R3','P3',50000,'completed');

執行查詢,核對實際結果

SQLite 唯讀查詢
SELECT i.id,i.customer_id,i.amount_cents FROM invoices i
LEFT JOIN customers c ON c.id=i.customer_id
WHERE i.status='issued' AND c.id IS NULL ORDER BY i.id;
以上 SQLite 假設資料的查詢結果
編號客戶編號金額(分)
I3C920000
下載可編輯 CSV ↓

I3 指向 C9,但主檔只有 C1 和 C2。若報表使用內連接,這張 HK$200.00 發票便會消失。應查原發票及客戶對照,不能單憑金額決定轉到哪位客戶。

按資料範圍使用結果

假設資料刻意保留一筆接不到主檔的紀錄,用來示範排查;並非建議正式系統關閉外鍵。客戶刪除、封存及搬遷對照仍須按實際保留規則處理。

本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。

相關資源