Ich hatte neulich die Herausforderung, in SQL Zahlen kumulieren zu müssen. Im Netz kursieren dazu viele verschiedene Ansätze, von denen die meisten aber nicht besonders elegant bzw. performant bei großen Zahlenmengen sind. Auch muss sichergestellt sein, dass z.B. bei fehlenden Perioden in der Ursprungstabelle trotzdem ein YTD-Wert angezeigt wird. D.h. wenn z.B. für Januar, Februar und April Werte vorliegen (März ist leer), dann muss der YTD-Wert trotzdem fortgeschrieben werden, sodass dann der Märzwert gleich dem Februarwert ist.

Eine – wie ich zumindest finde – elegante Lösung könnte wie folgt sein:

Zunächst legt man sich eine Hilfstabelle an, die zwei Spalten enthält: alle Perioden im benötigten Zeitraum sowie in der zweiten Spalte untereinander die von Januar bis zur jeweiligen Zielperiode enthaltenen Perioden. Der Januar enthält also nur den Januar, der Februar den Januar und Februar usw.

Dann erstellt man die Abfrage mit einem Join auf diese Hilfstabelle:

Ausschnitt der Hilfstabelle:

Code:

SELECT 
b.Periode,
ISNULL(SUM(a.Kennzahl),0) AS Kennzahl
FROM dbo.Fakten a 
RIGHT JOIN dbo.Hilfstabelle b
ON (a.Periode = b.Kind)
GROUP BY b.Periode
ORDER BY b.Periode

Durch den Join beziehen wir uns also auf alle Kinderelemente und dadurch, dass es ein Right Join ist, werden auch Monate berücksichtigt, die in der Faktentabelle nicht vorkommen und damit dann wie gefordert fortgeschrieben.

Die SUM-Funktion aggregiert dann die Kinder, die alle unter dem Zielelement sitzen zur gewünschten Summe.

Die ursprüngliche Tabelle:

Das Ergebnis der Abfrage:

Wir sehen: das Ergebnis stimmt und die Periode, die vorher nicht vorkamen, werden jetzt korrekt in der YTD-Darstellung angezeigt.