跳至內容
Astera Technology

完全未用過的預算,餘額為甚麼是空白?

沒有開支時按零使用額計餘額;已存在但漏填金額的開支,則須另查。

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

先準備用來排查的資料

假設開支清單齊全,每個預算都應有剩餘額。沒有配對金額時,合計可能回傳空值,再相減也變空白。把合計空值轉為零,未使用的預算才會保留全額。

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

假設輸入:budgets
預算代碼預算(分)
IT100000
OPS200000
下載可編輯 CSV ↓
假設輸入:expenses
編號預算代碼金額(分)
X1IT20000
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE budgets(code TEXT PRIMARY KEY,budget_cents INTEGER);
CREATE TABLE expenses(id TEXT PRIMARY KEY,code TEXT,amount_cents INTEGER);
INSERT INTO budgets VALUES ('IT',100000),('OPS',200000);
INSERT INTO expenses VALUES ('X1','IT',20000);

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

錯誤示範查詢:只用來重現問題
SELECT b.code,b.budget_cents-SUM(e.amount_cents) AS remaining_cents
FROM budgets b LEFT JOIN expenses e ON e.code=b.code GROUP BY b.code,b.budget_cents ORDER BY b.code;
實際執行的錯誤示範結果
預算代碼餘額(分)
IT80000
OPSNULL(未知或未能定義)
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT b.code,b.budget_cents-COALESCE(SUM(e.amount_cents),0) AS remaining_cents
FROM budgets b LEFT JOIN expenses e ON e.code=b.code GROUP BY b.code,b.budget_cents ORDER BY b.code;
更正查詢的實際結果
預算代碼餘額(分)
IT80000
OPS200000
下載可編輯 CSV ↓

IT 預算 HK$1,000,已用 HK$200,餘下 HK$800。OPS 沒有開支,應餘下 HK$2,000,而不是金額未知。更正只處理沒有開支的情況,未證明原清單全部齊全。

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

加入一筆真實零金額的假設 OPS 開支,餘額仍是 HK$2,000。數學上一樣,審核歷史卻不同。

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

新假設副本內的邊界改動
INSERT INTO expenses VALUES ('X2','OPS',0);
改動後再執行更正查詢的實際結果
預算代碼餘額(分)
IT80000
OPS200000
下載可編輯 CSV ↓

已有開支卻漏填金額時,SUM 也可能略過,須另外列出,不能用此表證明資料齊全。

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

相關資源