Aggregation von data zum Erreichen der Gesamtmenge

Ich habe eine Abfrage, die die unten ausgibt

Bildbeschreibung hier eingeben

Ich muss es bekommen, um eine laufende Summe so für März geben würde es geben, was in Feb und Mar bezahlt wurde, dann für April Feb, Mar & Apr und so weiter.

Kommen Sie niemals auf diese Art von Aggregation vor in SQL.

select [monthid], [month], ( select sum([paid]) from tbl t2 where t2.[monthid] <= t1.[monthid] ) as paid from tbl t1 
 SELECT T.MonthId ,T.[Month] ,T.Value ,RT.runningTotal from Table_Name T CROSS APPLY ( SELECT SUM(value) as runningTotal FROM Table_Name WHERE MonthId <= T.MonthId ) as RT order by T.MonthId 

Testdaten

 declare @t1 TABLE (Monthid int, month varchar(10), Value decimal(18,2)) insert into @t1 values (1,'JAN-13',35.00) ,(2, 'FEB-13',35.00) ,(3,'MAR-13',35.00) ,(4,'APR-13',35.00) ,(5,'JUN-13',35.00) ,(6,'Jul-13',35.00) ,(7,'Aug-13',35.00) SELECT T.MonthId ,T.[Month] ,T.Value ,RT.runningTotal from @t1 T CROSS APPLY ( SELECT SUM(value) as runningTotal FROM @t1 WHERE MonthId <= T.MonthId ) as RT order by T.MonthId 

ERGEBNISSE

 MonthId Month Value runningTotal 1 JAN-13 35.00 35.00 2 FEB-13 35.00 70.00 3 MAR-13 35.00 105.00 4 APR-13 35.00 140.00 5 JUN-13 35.00 175.00 6 Jul-13 35.00 210.00 7 Aug-13 35.00 245.00 

Sie können diese Frage und meine Antwort darauf überprüfen. Stellt sich heraus, dass rekursive gemeinsame Tabelle Ausdruck ist die schnellste Methode, um insgesamt in SQL server <2012 laufen.

Also in deinem Fall könnte es so etwas wie:

 with cte as ( select T.MonthID, T.Month, T.Paid, T.Paid as Running_Paid from Table1 as T where T.MonthID = 118 union all select T.MonthID, T.Month, T.Paid, T.Paid + C.Running_Paid as Running_Paid from cte as C inner join Table1 as T on T.MonthID = C.MonthID + 1 ) select * from cte option (maxrecursion 0) 

Laufen Summen im Jahr 2008 sind irgendwie ein Schmerz. SQL Fiddle scheint MIA wieder gegangen zu sein, aber hier ist ein einfaches Beispiel dafür, wie du es machen kannst.

deklarieren @ t1 TABELLE (monthid int, mth varchar (10), bezahlt dezimal (18,2), running_paid dezimal (18,2))

 insert into @t1 values (1,'JAN-13',35.00,0) ,(2, 'FEB-13',35.00,0) ,(3,'MAR-13',35.00,0) declare @running decimal(18,2) set @running= 0 update @t1 set running_paid = @running, @running= @running+ paid select * from @t1 

Was wird dir geben:

 ID MTH PAID RUNNING_PAID 1 JAN-13 35.00 35.00 2 FEB-13 35.00 70.00 3 MAR-13 35.00 105.00 

EDIT: Wie Bogdan Sahlean darauf hinweist, ist das ein sehr flippiger kleiner process. Du kannst auch einen Cursor benutzen:

 declare @t1 TABLE (monthid int, mth varchar(10), paid decimal(18,2) ) insert into @t1 values (1,'JAN-13',35.00) ,(2, 'FEB-13',35.00) ,(3,'MAR-13',35.00) declare @running table (monthid int, mth varchar(10), paid decimal(18,2), running_paid decimal(18,2)) declare c cursor for select monthid,mth,paid from @t1 open c declare @Id int declare @Mth varchar(10) declare @paid decimal(18,2) declare @Running_Total decimal(18,2) set @Running_Total = 0 fetch next from c into @Id,@Mth,@paid WHILE @@FETCH_STATUS = 0 begin fetch next from c into @Id,@Mth,@paid select @Running_Total = @Running_Total + @paid --Here's this version's hack for running total insert into @running values (@Id,@Mth,@paid,@Running_Total) end select * from @running 

Sie alle Art von Gestank. Das ist in SQL 2012 viel einfacher.