Create table and insert data:
CREATE TABLE [dbo].[testsum](
[name] [varchar](10) NULL,
[val] [int] NULL,
[ID] [int] NULL
) ON [PRIMARY]
insert into [testsum] (id,name,val)
values(1,'A',10),
(2,'B',20),
(3,'C',30)
To find cumulative sum first you need to self join on condition >=
select t1.*,t2.* from testsum t1 inner join testsum t2 on t1.ID>=t2.ID
t1 | t2 | ||||
ID | name | val | ID | name | val |
1 | A | 10 | 1 | A | 10 |
2 | B | 20 | 1 | A | 10 |
3 | C | 30 | 1 | A | 10 |
2 | B | 20 | 2 | B | 20 |
3 | C | 30 | 2 | B | 20 |
3 | C | 30 | 3 | C | 30 |
Group by ID and SUM.
select t1.id, t1.val, SUM(t2.val) as cumSum from testsum t1 inner join testsum t2 on t1.id >= t2.id group by t1.id, t1.val order by t1.id
t1 | t2 | ||||
ID | name | val | ID | name | val |
1 | A | 10 | 1 | A | 10 |
2 | B | 20 | 1 | A | 10 |
3 | C | 30 | 1 | A | 10 |
2 | B | 20 | 2 | B | 20 |
3 | C | 30 | 2 | B | 20 |
3 | C | 30 | 3 | C | 30 |
We reach to output:
id | val | cumSum |
1 | 10 | 10 |
2 | 20 | 30 |
3 | 30 | 60 |