跳至內容
Astera Technology

每次入貨價不同,平均單價應怎樣計?

按每批數量加權,不能把大批及一件的入貨價當成同等份量。

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

先準備用來排查的資料

要看的是這組入貨平均每件成本。直接平均單價會讓每行同樣重要,不管收一件還是九件。先合計數量乘單價,再除以總件數,並處理總件數為零。

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

假設輸入:purchases
編號貨品編號數量單價(分)
P1A11000
P2A92000
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE purchases(id TEXT PRIMARY KEY,sku TEXT,qty INTEGER,unit_cents INTEGER);
INSERT INTO purchases VALUES ('P1','A',1,1000),('P2','A',9,2000);

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

錯誤示範查詢:只用來重現問題
SELECT sku,ROUND(AVG(unit_cents),2) AS average_unit_cents FROM purchases GROUP BY sku ORDER BY sku;
實際執行的錯誤示範結果
貨品編號平均單價(分)
A1500
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT sku,ROUND(1.0*SUM(qty*unit_cents)/NULLIF(SUM(qty),0),2) AS average_unit_cents
FROM purchases GROUP BY sku ORDER BY sku;
更正查詢的實際結果
貨品編號平均單價(分)
A1900
下載可編輯 CSV ↓

一件 HK$10,另九件各 HK$20,共 19000 分除以十件,每件是 1900 分。直接平均會成 1500 分。此數值只看這組入貨,並非完整存貨成本方法。

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

加入零件數、單價 9999 分的一行,沒有增加貨品或成本,結果仍是 1900 分。

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

新假設副本內的邊界改動
INSERT INTO purchases VALUES ('P3','A',0,9999);
改動後再執行更正查詢的實際結果
貨品編號平均單價(分)
A1900
下載可編輯 CSV ↓

未計運費、稅、退貨及期初存貨;零數量報價一般應與已收貨資料分開。

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

相關資源