Skip to content
Advertisement

How to add next and subtract preceding row in SQL Server based on condition

I am trying to calculate the cumulative sum based on TranslationType column in SQL Server.

Sample data:

Id  TransactionType Value
-------------------------
1   Receipt          10
2   Issue             2
3   Receipt          10
4   Issue             5
5   Issue             3

I tried but I have a problem the output I am getting is wrong :

Id  TransactionType DiffValue
-----------------------------
1   Receipt          10
2   Issue             8
3   Receipt          22
4   Issue             5
5   Issue             2

Desired output of the difference value:

Id  TransactionType  Value  DiffValue
---------------------------------------
1   Receipt           10        10
2   Issue              2         8  if issue then 10-2
3   Receipt           10        18  if receipt then 10+8 
4   Issue              5        13  if issue then 18-5
5   Issue              3        10  if issue then 13-3

SQL create scripts:

DROP TABLE #Temp 

CREATE TABLE #Temp
(
    Id INT,
    TransactionType VARCHAR(50),
    value INT,
)

INSERT INTO #Temp (Id, TransactionType, value)
VALUES (1, 'Receipt', 10), (2, 'Issue', 2), (3, 'Receipt', 10),
       (4, 'Issue', 5), (5, 'Issue', 3)

SELECT * FROM #Temp

My query attempt:

SELECT
    Id,
    TransactionType,
    CASE 
       WHEN TransactionType = 'Receipt' 
          THEN SUM(value) OVER (ORDER BY Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)  
       ELSE LAG(value) OVER (ORDER BY Id)  - value
    END AS DiffValue
FROM
    #Temp

Advertisement

Answer

You should be summing a CASE expression which can distinguish between debits and credits:

SELECT 
    Id,
    TransactionType,
    SUM(CASE WHEN TransactionType = 'Receipt' THEN value ELSE -1.0*value END)
        OVER (ORDER BY Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS DiffValue
FROM #Temp
ORDER BY Id;

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement