[英]Calculate Balance from Transactions
我有一張看起來像這樣的桌子
ID Type Amount Created
10 4 30,00 2019-11-29 11:34:54.417
1 1 10,50 2019-11-19 11:34:54.417
3 2 16,50 2019-11-17 11:34:54.417
2 4 11,50 2019-11-15 11:34:54.417
4 6 10,00 2019-11-11 11:34:54.417
5 3 8,60 2019-10-19 11:34:54.417
7 1 21,50 2019-05-19 11:34:54.417
8 4 9,00 2019-04-19 11:34:54.417
9 1 8,00 2019-02-19 11:34:54.417
6 1 1,50 2019-01-19 11:34:54.417
想象一下這個表有一個電子錢包,這些是帶有 ID、類型(取款、撤銷、存款等)、金額和創建日期時間的交易。 假設所有這 10 筆交易都指向特定的客戶。 因此,如果我跑
SELECT SUM(Amount) AS Balance
FROM transactions
WHERE Created <= '20191120'
此查詢將返回該客戶在 2019/11/20 之前的余額。
我想要的是對該表運行 select 查詢並僅保留類型 = 4 的事務。 例如
SELECT ID
, Type
, Amount
, Created
FROM transactions
WHERE type=4
此查詢返回以下內容
ID Type Amount Created
2 4 11,50 2019-11-15 11:34:54.417
8 4 9,00 2019-04-19 11:34:54.417
10 4 30,00 2019-11-29 11:34:54.417
不過,我真正想要的是此結果集中的一個額外列,顯示每次交易時客戶的余額(類型=4)。 例如,當他使用 ID = 2 進行交易時,他在此之前的余額(不包括當前(id=2 )為 (1,50+8,00+9,00+21,50+8,60+10,00 ),當他使用 ID = 8 進行交易時,他的余額為 (1,50+8,00) 等等..
所需的結果集將是
ID Type Amount Created Balance
2 4 11,50 2019-11-15 11:34:54.417 58,60
8 4 9,00 2019-04-19 11:34:54.417 9,50
10 4 30,00 2019-11-29 11:34:54.417 97,1
我想在一個 Select 查詢中執行此操作。 我有一些想法分兩步完成,但這不是我的意圖,我只需要運行一次並擁有所有五個所需的列。
仔細查看您想要的 output,假設您的 DBMS 支持 window 函數,您可以使用偽累積和來執行此操作:
SELECT ID, Type, Amount, Created, Balance
FROM (
SELECT ID, Type, Amount, Created,
SUM(Amount) OVER(-- Sum "amount" of all rows before current row (exclude current row)
ORDER BY Created ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) AS Balance
FROM transactions
) src
WHERE type = 4
ORDER BY id
;
另外, id=2
的余額不應該是58,6
而id=10
的余額不應該是97.1
嗎?
你想要一個累積和過濾:
SELECT t.*
FROM (SELECT t.*, SUM(Amount) OVER (ORDER BY Created) - Amount AS Balance
FROM transactions t
WHERE Created <= '20191120'
) t
WHERE type = 4;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.