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
Print article | This entry was posted by Christoph Ingenhaag on 28.02.11 at 22:09:02 . Follow any responses to this post through RSS 2.0. |