SQL: Summe über Bereich mit Ersetzen von NULL
Hallo Community,
ich denke über ein Problem nach, welches ich hier vereinfacht darstellen möchte:
Ich möchte eine zusätzliche Spalte erzeugen, die mir eine fortlaufende Summe von Wert 1 ermittelt. Soweit erst einmal kein Problem. Nun möchte ich die Summe immer nur für den Bereich von einer Ziffer in der Spalte wert2 bis zur nächsten Ziffer in Spalte wert2 erzeugen. Wäre auch kein Thema, wenn dazwischen nicht immer NULL Werte wären.
Mein Wunschergebnis sähe so aus:
Ich habe viel probiert mit LAG oder SUM OVER... und mit ROW_COUNT aber mir fehlt da irgendwie der Henkel. Kann mir jemand von euch einen Anstoß geben, mit dem ich weiter komme?
Viele Grüße
Zehbart
ich denke über ein Problem nach, welches ich hier vereinfacht darstellen möchte:
wert1 | wert2 |
---|---|
1 | 1 |
10 | NULL |
1 | NULL |
20 | 2 |
15 | NULL |
30 | NULL |
Ich möchte eine zusätzliche Spalte erzeugen, die mir eine fortlaufende Summe von Wert 1 ermittelt. Soweit erst einmal kein Problem. Nun möchte ich die Summe immer nur für den Bereich von einer Ziffer in der Spalte wert2 bis zur nächsten Ziffer in Spalte wert2 erzeugen. Wäre auch kein Thema, wenn dazwischen nicht immer NULL Werte wären.
Mein Wunschergebnis sähe so aus:
wert1 | wert2 | Teilsumme |
---|---|---|
1 | 1 | 1 |
10 | NULL | 11 |
1 | NULL | 12 |
20 | 2 | 20 |
15 | NULL | 35 |
30 | NULL | 65 |
Ich habe viel probiert mit LAG oder SUM OVER... und mit ROW_COUNT aber mir fehlt da irgendwie der Henkel. Kann mir jemand von euch einen Anstoß geben, mit dem ich weiter komme?
Viele Grüße
Zehbart
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6111834827
Url: https://administrator.de/forum/sql-summe-ueber-bereich-mit-ersetzen-von-null-6111834827.html
Ausgedruckt am: 06.06.2025 um 17:06 Uhr
6 Kommentare
Neuester Kommentar
Teilsumme = SUM(wert1)
OVER(PARTITION by ISNULL(wert2, 0)
/* ORDER by wert2 */
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
Versuche das mal.
Ggf. kann das auskommentierte ORDER BY noch relevant werden.
Edit
Ich sehe gerade: wenn der Wert NULL ist, soll er den der vorherigen Zeile nutzen!?
In diesem Fall hilft dir LAG() ggf. https://www.sqlservertutorial.net/sql-server-window-functions/sql-server ...
Mit ein bisschen verschachteln geht das, wert2 lässt sich ebenfalls mit sum() OVER "vervollständigen", so das die Zusammengehörigkeit in einem ersten Schritt entsteht und dann ein Kriterium für PARTITION BY vorhanden ist.
Die fehlt in deinem Beispiel eine Sortierung, die kann man nicht ableiten. Auch ist DBMS und Version nicht ganz unerheblich.
WITH tabelle(sort,w1,w2) AS (
SELECT 0,1,1 UNION ALL
SELECT 1,10,NULL UNION ALL
SELECT 2,1,NULL UNION ALL
SELECT 3,20,2 UNION ALL
SELECT 4,15,NULL UNION ALL
SELECT 5,30,NULL
)
SELECT *,
sum(t.w1) OVER (PARTITION BY t.w2 ORDER BY t.sort) AS summe
FROM (
SELECT *,
sum(w2) OVER (ORDER BY sort) AS part
FROM tabelle
) t
ORDER BY t.sort