跳至內容
Astera Technology

用最新匯率,為甚麼改了舊採購的換算額?

逐筆按採購日配對已指定的假設匯率,不把最新一個套到全部歷史資料。

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

先準備用來排查的資料

本例訂明取採購日或之前最近的匯率,方向是每美元兌港元。全局最新匯率會把以前所有採購都按較後數值換算。須逐筆配對,沒有歷史匯率則保留空值。

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

假設輸入:purchases
編號採購日美元(分)
P12026-10-0210000
P22026-10-0610000
下載可編輯 CSV ↓
假設輸入:rates
生效日每美元兌港元
2026-10-017.8
2026-10-057.7
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE purchases(id TEXT PRIMARY KEY,bought_on TEXT,usd_cents INTEGER);
CREATE TABLE rates(valid_from TEXT PRIMARY KEY,hkd_per_usd REAL);
INSERT INTO purchases VALUES ('P1','2026-10-02',10000),('P2','2026-10-06',10000);
INSERT INTO rates VALUES ('2026-10-01',7.8),('2026-10-05',7.7);

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

錯誤示範查詢:只用來重現問題
SELECT p.id,CAST(ROUND(p.usd_cents*r.hkd_per_usd,0) AS INTEGER) AS hkd_cents
FROM purchases p CROSS JOIN rates r WHERE r.valid_from=(SELECT MAX(valid_from) FROM rates) ORDER BY p.id;
實際執行的錯誤示範結果
編號港元(分)
P177000
P277000
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT p.id,CAST(ROUND(p.usd_cents*r.hkd_per_usd,0) AS INTEGER) AS hkd_cents
FROM purchases p LEFT JOIN rates r ON r.valid_from=(SELECT MAX(valid_from) FROM rates WHERE valid_from<=p.bought_on) ORDER BY p.id;
更正查詢的實際結果
編號港元(分)
P178000
P277000
下載可編輯 CSV ↓

P1 用假設 7.8,換成港元 78000 分;P2 用 7.7,換成 77000 分。兩筆原值都是美元 10000 分。這些是測試輸入,不是現行匯率,也不是會計準則的換算要求。

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

P0 早於第一個匯率,要保留該行但換算額是空值;刪走或借未來匯率都會遮蓋未解決項目。

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

新假設副本內的邊界改動
INSERT INTO purchases VALUES ('P0','2026-09-30',10000);
改動後再執行更正查詢的實際結果
編號港元(分)
P0NULL(未知或未能定義)
P178000
P277000
下載可編輯 CSV ↓

只示範一對貨幣及指定取整步驟;缺匯率、反方向及不同匯率類型須另訂政策。

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

相關資源