跳至內容
Astera Technology

最後存量是正數,途中會否曾出貨過量?

逐筆看存量變化,找出途中曾變負數的事件,而非只看期末。

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

先準備用來排查的資料

後來入貨可以令期末回正,但較早出貨仍可能超出當時貨量。按本例入帳次序逐筆計存量,列出負數時點。清單只是查核起點,不代表可直接刪哪一筆。

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

假設輸入:movements
編號貨品編號數量變動
1A5
2A-7
3A4
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE movements(id INTEGER PRIMARY KEY,sku TEXT,delta_qty INTEGER);
INSERT INTO movements VALUES (1,'A',5),(2,'A',-7),(3,'A',4);

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

錯誤示範查詢:只用來重現問題
SELECT sku,SUM(delta_qty) AS balance_qty FROM movements GROUP BY sku HAVING SUM(delta_qty)<0 ORDER BY sku;
實際執行的錯誤示範結果
查詢結果
沒有回傳資料(空結果)
下載可編輯 CSV ↓
更正後的 SQLite 查詢
WITH running AS (SELECT id,sku,SUM(delta_qty) OVER(PARTITION BY sku ORDER BY id ROWS UNBOUNDED PRECEDING) AS balance_qty FROM movements)
SELECT id,sku,balance_qty FROM running WHERE balance_qty<0 ORDER BY sku,id;
更正查詢的實際結果
編號貨品編號結存數量
2A-2
下載可編輯 CSV ↓

先收五、出七、再收四,最後是兩件。只看期末沒有問題,逐筆卻在第 2 筆變負二。可能是漏了較早入貨,或入帳先後錯誤,須查憑證才能判斷。

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

出貨改成剛好五件,中途歸零卻沒有負數,例外清單便沒有結果。

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

新假設副本內的邊界改動
UPDATE movements SET delta_qty=-5 WHERE id=2;
改動後再執行更正查詢的實際結果
查詢結果
沒有回傳資料(空結果)
下載可編輯 CSV ↓

期初是零,編號代表已訂入帳先後。正式存貨須有期初、有效排序及是否准許負存量政策。

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

相關資源