Fortlaufende Summe

 

Eine Möglichkeit, eine fortlaufende Summe zu erzeugen ist die Nachfolgende.

Voraussetzung ist eine fortlaufende Nummer ohne Lücken und aus Gründen der Performance ein Index auf die fortlaufenden Nummer.

Da man diese Voraussetzungen selten vorfindet, lege ich eine entsprechende temporäre Tabelle an, die diesen Voraussetzungen genügt.

Aus den Testdaten

begin try drop table ##test, #test end try begin catch end catch

select

n as ID,

cast(abs(checksum(newid())) * 1.0 / 10000000 as int) as Betrag

into ##test

from dbo.numbers(1,100000) -- http://stevekass.com/2006/06/03/how-to-generate-a-sequence-on-the-fly

where

n % 3 = 1 or

n % 5 = 1

go

 

erzeuge ich die temporäre Tabelle:

select

row_number() over (order by ID) as RNR,

ID,

Betrag

into #test

from ##test

go

create unique clustered index cuidx on #test(RNR)

go

 

Und hier die Abfrage

;with posten as

(

select

RNR,

ID,

Betrag,

1 as MinRNR,

count(*) over (partition by 1) as MaxRNR

from #test

),

zeilenweise as

(

select

RNR,

ID,

Betrag,

Betrag as Summe,

MinRNR,

MaxRNR

from posten

where

RNR = MinRNR

 

union all

 

select

z.RNR + 1,

p.ID,

p.Betrag,

z.Summe + p.Betrag,

z.MinRNR,

z.MaxRNR

from zeilenweise z

inner join posten p

on

p.RNR = z.RNR + 1

where

z.RNR < z.MaxRNR

)

select

ID,

Betrag,

Summe

from zeilenweise

option (maxrecursion 0)

Die Ausführungsgeschwindigkeit ist bis ca. 100.000 Datensätze durchaus annehmbar...

Viele Grüße

Christoph Ingenhaag