zehbart

SQL: Summe über Bereich mit Ersetzen von NULL

Hallo Community,
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
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: 06.06.2025 um 17:06 Uhr

em-pie
em-pie 24.02.2023 um 12:12:32 Uhr
Goto Top
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
Goto Top
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
Goto Top
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 ...
Zehbart
Zehbart 24.02.2023 aktualisiert um 13:27:51 Uhr
Goto Top
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:
wert1 wert 2
1 1
10 NULL
1 NULL
20 2
15 NULL
30 NULL

Nachher:
wert1 wert 2 neu
1 1 1
10 NULL 1
1 NULL 1
20 2 2
15 NULL2
30 NULL2
ukulele-7
Lösung ukulele-7 24.02.2023 um 13:55:01 Uhr
Goto Top
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
Goto Top
Hey ukulele-7,
allerbesten Dank. Da ist er, der Henkel der gefehlt hat! Damit komme ich weiter.

Schönes Wochenende
Zehbar