跳至內容
Astera Technology

一筆付款分批退款後,實際還保留多少?

只扣已完成退款,待處理申請另外看;沒有退款的付款也保留在清單。

先訂清楚要判斷甚麼,再準備資料

一筆付款可有多筆退款,先沿付款編號合計。按本例狀態規則,待處理退款還未實際退錢,不應先扣。沒有退款也要顯示原付款,退款數填零,才能核對完整收款清單。

以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。

假設輸入節錄;完整相關資料見下方 SQL
編號付款編號金額(分)狀態代碼
R1P110000completed
R2P15000pending
R3P350000completed
下載可編輯 CSV ↓
可直接執行的完整假設資料(SQLite)
CREATE TABLE customers(id TEXT PRIMARY KEY, name TEXT);
CREATE TABLE invoices(id TEXT PRIMARY KEY, customer_id TEXT, amount_cents INTEGER, due_on TEXT, status TEXT);
CREATE TABLE payments(id TEXT PRIMARY KEY, invoice_id TEXT, amount_cents INTEGER, status TEXT);
CREATE TABLE refunds(id TEXT PRIMARY KEY, payment_id TEXT, amount_cents INTEGER, status TEXT);
INSERT INTO customers VALUES ('C1','Acorn'),('C2','Birch');
INSERT INTO invoices VALUES ('I1','C1',100000,'2026-10-01','issued'),('I2','C2',50000,'2026-10-20','issued'),('I3','C9',20000,'2026-10-02','issued'),('I4','C1',30000,'2026-09-01','void');
INSERT INTO payments VALUES ('P1','I1',40000,'settled'),('P2','I1',20000,'settled'),('P3','I2',50000,'settled'),('P4','I3',20000,'failed');
INSERT INTO refunds VALUES ('R1','P1',10000,'completed'),('R2','P1',5000,'pending'),('R3','P3',50000,'completed');

執行查詢,核對實際結果

SQLite 唯讀查詢
WITH r AS (
 SELECT payment_id,SUM(amount_cents) AS refunded_cents FROM refunds
 WHERE status='completed' GROUP BY payment_id
)
SELECT p.id,p.amount_cents,COALESCE(r.refunded_cents,0) AS refunded_cents,
 p.amount_cents-COALESCE(r.refunded_cents,0) AS retained_cents
FROM payments p LEFT JOIN r ON r.payment_id=p.id
WHERE p.status='settled' ORDER BY p.id;
以上 SQLite 假設資料的查詢結果
編號金額(分)已退(分)保留款項(分)
P1400001000030000
P220000020000
P350000500000
下載可編輯 CSV ↓

P1 已退 HK$100.00,仍保留 HK$300.00;待處理的 HK$50.00 未計入。P2 沒有退款,保留 HK$200.00;P3 全額退回,保留零。比起單一「已退款」標記,這樣才分得清部分退款、未退款及全額退款。

按資料範圍使用結果

若保留金額變負數,應查是否超額退款,不能直接改成零。例子未包括拒付、支付平台費用、撤銷退款或不同結算日期。

本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。

相關資源