zehbart

SQL: Summe über Bereich mit Ersetzen von NULL

Hallo Community,
ich denke über ein Problem nach, welches ich hier vereinfacht darstellen möchte:

wert1wert2
11
10NULL
1NULL
202
15NULL
30NULL

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:

wert1wert2Teilsumme
111
10NULL11
1NULL12
20220
15NULL35
30NULL65

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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 6111834827

Url: https://administrator.de/forum/sql-summe-ueber-bereich-mit-ersetzen-von-null-6111834827.html

Ausgedruckt am: 21.07.2025 um 01:07 Uhr

em-pie
em-pie 24.02.2023 um 12:12:32 Uhr
Moin,

was passiert, wenn du in deinem Query ein ISNULL(wert2, 0) einarbeitest?

Gruß
em-pie
Zehbart
Zehbart 24.02.2023 um 12:17:32 Uhr
Danke für den schnellen Hinweis... Mir fehlt trotzdem noch die Idee, auf welcher Basis, bzw. mit welcher Bereichsdefinition ich dann die Teilsumme ziehen kann. SUM (wert2) OVER (PARTITION BY ???)
em-pie
em-pie 24.02.2023 aktualisiert um 13:11:08 Uhr
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. sqlservertutorial.net/sql-server-window-functions/sql-server-lag ...
Zehbart
Zehbart 24.02.2023 aktualisiert um 13:27:51 Uhr
Den Gedanken hatte ich auch schon. Leider werden so immer nur die Daten aus wert1 summiert, bei denen NULL in Wert2 steht.

Im Prinzip fehlt mir der Weg, wie ich ich aus den NULL Werte den jeweils letzten Zahlenwert aus wert2 machen kann.

Vorher:
wert1wert 2
11
10NULL
1NULL
202
15NULL
30NULL

Nachher:
wert1wert 2neu
111
10NULL1
1NULL1
2022
15NULL2
30NULL2
ukulele-7
Lösung ukulele-7 24.02.2023 um 13:55:01 Uhr
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.
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
Die fehlt in deinem Beispiel eine Sortierung, die kann man nicht ableiten. Auch ist DBMS und Version nicht ganz unerheblich.
Zehbart
Zehbart 24.02.2023 um 14:29:44 Uhr
Hey ukulele-7,
allerbesten Dank. Da ist er, der Henkel der gefehlt hat! Damit komme ich weiter.

Schönes Wochenende
Zehbar