如何根据多条记录中存在的交易计算剩余余额/金额

时间:2019-05-01 22:44:30

标签: sql sql-server tsql

我正在尝试对礼品卡的销售和使用进行跟进。 我想计算每张卡的运行剩余余额。

特异性:我使用的表包含所有已完成的事务。 (每行一笔交易)我有一笔交易,但没有累进余额。

在每次交易(第行)后,我如何添加一个新的科隆来计算剩余余额

在我的表中,我有很多卡号,其中包含2种不同类型的事件(Sale和USE)以及每笔交易的金额,第一次交易始终是指礼品卡的购买和初始金额,其他行是指礼品卡的实际用途及其实际金额。

enter image description here

   SELECT C_NUMBER,
   CASE WHEN TRANSACTION_TYPE = 'VEN' THEN 'SALE' ELSE 'USE' END AS 
   [EVENT],
    TRANSACTION_DATE, AMOUNT FROM CARDS_TRANSACTION 
    WHERE C_NUMBER in ( '111111111895' , '16222222225082' )

我希望得到以下输出:(新列为事件类型“使用”的记录计算差异,因为事件“销售”中的余额等于金额。

enter image description here

2 个答案:

答案 0 :(得分:1)

您似乎想要累积的总和:

select ct.*,
       sum(case when event = 'SALE' then amount
                when event = 'USE' then - amount
           end) over (partition by number order by trans_date
                     ) as balance
from cards_transaction ct;

答案 1 :(得分:0)

上面的代码适用于唯一数字。 不幸的是,我有很多空卡号和重复号,这也使得剩余余额的计算错误。

我设法使用交易日期分隔重复项

   SELECT C_NUMBER, CASE WHEN TRANSACTION_TYPE = 'VEN' THEN 'SALE' ELSE 'USE' END AS  
   [EVENT], TRANSACTION_DATE, AMOUNT 
   FROM CARDS_TRANSACTION CT
   LEFT OUTER JOIN  CARDS_TRANSACTION  CARDS_TRANSACTION_SALE ON 
   CARDS_TRANSACTION_SALE.EVENT = 'SALE' AND 
   CARDS_TRANSACTION_SALE.C_NUMBER= CT.C_NUMBER AND  
   CARDS_TRANSACTION_SALE.TRANSACTION_DATE = (SELECT MAX(TRANSACTION_DATE) 
   FROM CARDS_TRANSACTION
   WHERE C_NUMBER = CT.C_NUMBER AND 
   EVENT = 'SALE' AND 
   TRANSACTION_DATE <= CT.TRANSACTION_DATE)

是否可以处理此异常?使用UNION也许会有更多的自由度?

预先感谢

相关问题