Result zeilenweise berechnen/ändern

Chuky666

SQL-Guru
Beiträge
165
Hi zusammen,

Ausgangssituation:

bestand menge
520 0
510 -10
510 -10
510 -10
510 -10
510 -10
510 -10
510 -10


Ziel:
bestand menge
520 0
520 -10
510 -10
500 -10
490 -10
480 -10
470 -10
460 -10
450 -10
440 160
600


Wie komme ich zu diesem Ziel ohne einen Cursor zu benutzen?
Mit While + update hats nicht so geklappt wie ich wollte....

Kennt einer von euch noch einen anderen Weg?

Grüße
 
Werbung:
Kennt einer von euch noch einen anderen Weg?

berechnen via Window-Funktionen?

Code:
test=*# select * from chuy666;
 id | bestand | menge
----+---------+-------
  1 |  520 |  0
  2 |  510 |  10
  3 |  510 |  10
  4 |  510 |  10
  5 |  510 |  10
  6 |  510 |  10
  7 |  510 |  10
  8 |  510 |  10
  9 |  510 |  10
 10 |  510 |  10
(10 rows)

Time: 0,171 ms
test=*# select *, bestand-lag(menge) over (order by id ) as neu_bestand from chuy666;
 id | bestand | menge | neu_bestand
----+---------+-------+-------------
  1 |  520 |  0 |
  2 |  510 |  10 |  510
  3 |  510 |  10 |  500
  4 |  510 |  10 |  500
  5 |  510 |  10 |  500
  6 |  510 |  10 |  500
  7 |  510 |  10 |  500
  8 |  510 |  10 |  500
  9 |  510 |  10 |  500
 10 |  510 |  10 |  500
(10 rows)

so in etwa.
 
mhh so recht ist es das auch nicht.... ich habe jetzt mal anhand der Northwind Datenbank folgendes Beipsiel probiert und bekomme ein "komisches" ergebnis, sowie einen Fehler das "Die Anweisung wurde beendet. Die maximale Rekursionstiefe 100 wurde vor Abschluss der Anweisung erreicht.".
Hier das Script dazu:

Code:
WITH  CTE(EmployeeID,lastname,firstname, anz) AS
(
SELECT   
a.EmployeeID,
a.lastname,
a.firstname AS TopParentCategoryID, 0 as anz
from dbo.Employees a WHERE  EmployeeID >0
UNION ALL
select
c.EmployeeID,
c.lastname,
c.firstname AS TopParentCategoryID,
cte.anz + 10 as anz1
from dbo.Employees c,cte
WHERE cte.EmployeeID = c.EmployeeID
)
SELECT * FROM CTE

Ich verstehe das Ergebnis, sowie die Fehlermeldung nicht so ganz....kann mir jemand einen Tip geben?

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Hallo Chuky666,

hier ein kleines Beispiel zur Rekursion:
Code:
DECLARE @TA TABLE   
    (    Nr INT IDENTITY(1,1),
        Veraenderung INT
    )

INSERT INTO @TA (Veraenderung) VALUES (10)
INSERT INTO @TA (Veraenderung) VALUES (20)
INSERT INTO @TA (Veraenderung) VALUES (12)
INSERT INTO @TA (Veraenderung) VALUES (-10)
INSERT INTO @TA (Veraenderung) VALUES (108)
INSERT INTO @TA (Veraenderung) VALUES (-70);

WITH RR(Nr, Aenderung, Endbestand) AS
(SELECT  0 AS Nr, 0 AS Aenderung, 500 AS Endbestand
UNION ALL
SELECT S.Nr,
S.Veraenderung,
R.Endbestand+S.Veraenderung
FROM @TA S, RR R
WHERE R.Nr=S.Nr-1
)
SELECT * FROM RR

Ich hoffe, das ist etwas verständlicher als das Beispiel aus der Northwind.

Viele Grüße,
Tommi
 
Hi Tommi,

erstmal vielen dank! Das Example ist wesentlich besser :D

Wie sieht es mit Hunderten von Datensätzen aus? Ich glaube wenn ich die maxrecursion auf 0 (unendlich) setze bringt diese variante keinen Vorteil dem Cursor gegenüber?!

Grüße
 
Werbung:
Rekursion brauchst Du hier nicht, allerdings war mein Beispiel vorhin falsch, sorry.

Code:
test=*# select *, bestand-sum(menge) over (order by id ) as neu_bestand from chuy666;
 id | bestand | menge | neu_bestand
----+---------+-------+-------------
  1 |  520 |  0 |  520
  2 |  510 |  10 |  500
  3 |  510 |  10 |  490
  4 |  510 |  10 |  480
  5 |  510 |  10 |  470
  6 |  510 |  10 |  460
  7 |  510 |  10 |  450
  8 |  510 |  10 |  440
  9 |  510 |  10 |  430
 10 |  510 |  10 |  420
(10 rows)
 
Zurück
Oben