Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Result zeilenweise berechnen/ändern

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Chuky666, 12 Juni 2015.

  1. Chuky666

    Chuky666 Datenbank-Guru

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. Chuky666

    Chuky666 Datenbank-Guru

    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 von einem Moderator bearbeitet: 12 Juni 2015
  4. akretschmer

    akretschmer Datenbank-Guru

    Rekusion: siehe Rekursion.
     
  5. Tommi

    Tommi Datenbank-Guru

    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
     
  6. Chuky666

    Chuky666 Datenbank-Guru

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
    Tommi und ukulele gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden