簡體   English   中英

從交易中計算余額

[英]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
;

SQL 小提琴

另外, id=2的余額不應該是58,6id=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM