跳至內容
Astera Technology

銀行扣款為甚麼被加進收款總額?

先按匯出的收入及支出代碼決定正負,再計帳戶淨變動。

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

先準備用來排查的資料

本例銀行資料把所有金額存成正數,方向另放在 kind。直接相加會把支出當收入。先按明示代碼轉為正負數,再合計,不看自由文字猜是收還是支。

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

假設輸入:bank_rows
編號收支代碼金額(分)
B1credit10000
B2debit3000
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE bank_rows(id TEXT PRIMARY KEY,kind TEXT,amount_cents INTEGER);
INSERT INTO bank_rows VALUES ('B1','credit',10000),('B2','debit',3000);

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
SELECT SUM(amount_cents) AS net_change_cents FROM bank_rows;
實際執行的錯誤示範結果
淨變動(分)
13000
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT SUM(CASE WHEN kind='credit' THEN amount_cents WHEN kind='debit' THEN -amount_cents END) AS net_change_cents FROM bank_rows;
更正查詢的實際結果
淨變動(分)
7000
下載可編輯 CSV ↓

收入 10000 分、支出 3000 分,淨變動應 7000 分,不是 13000。這是帳戶變動,不是發票收入或期末結存;要計結存仍須期初數。

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

再支出 7000 分,淨變動是零;零也可以代表收支抵銷,並非沒有活動。

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

新假設副本內的邊界改動
INSERT INTO bank_rows VALUES ('B3','debit',7000);
改動後再執行更正查詢的實際結果
淨變動(分)
0
下載可編輯 CSV ↓

兩個代碼只屬本例,不代表所有銀行。未知代碼會變空值,須另查,不能只信合計。

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

相關資源