跳至內容
Astera Technology

兩張收貨單數量相同,SUM(DISTINCT) 會漏計嗎?

兩張不同收貨單即使同數量也要計,不能用數值是否相同來判斷重複。

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

先準備用來排查的資料

收貨主鍵已代表不同的已接收單據。SUM(DISTINCT qty) 會略去相同數值,即使單據編號不同。若有重試造成的重複,應先按紀錄識別處理,不能讓合計看數量猜哪些要刪。

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

假設輸入:receipts
編號貨品編號數量
R1A5
R2A5
R3A3
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE receipts(id TEXT PRIMARY KEY,sku TEXT,qty INTEGER);
INSERT INTO receipts VALUES ('R1','A',5),('R2','A',5),('R3','A',3);

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

錯誤示範查詢:只用來重現問題
SELECT sku,SUM(DISTINCT qty) AS received_qty FROM receipts GROUP BY sku ORDER BY sku;
實際執行的錯誤示範結果
貨品編號已收數量
A8
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT sku,SUM(qty) AS received_qty FROM receipts GROUP BY sku ORDER BY sku;
更正查詢的實際結果
貨品編號已收數量
A13
下載可編輯 CSV ↓

R1 和 R2 各收五件,R3 收三件,應共 13 件。錯誤查詢只計五及三這兩個不同數值,變成八件。收貨數量相同,不能證明同一事件重做。

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

加入新編號 R4,再收五件,總數變 18;不同數量值的集合卻沒有改變。

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

新假設副本內的邊界改動
INSERT INTO receipts VALUES ('R4','A',5);
改動後再執行更正查詢的實際結果
貨品編號已收數量
A18
下載可編輯 CSV ↓

本例只有正數已接收收貨;退回、沖銷、單位換算及運輸編號要另訂規則。

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

相關資源