Announcement

Collapse
No announcement yet.

Zahlenwerte aus einer Spalte kummulieren und in andere Spalte einfügen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zahlenwerte aus einer Spalte kummulieren und in andere Spalte einfügen

    Hallo,

    bin absoluter SQL Neuling und habe eine Tabelle, bei der ich Zahlenwerte aus einer Spalte aufsummieren möchte und den jeweiligen Wert in eine andere Spalte einfügen möchte.

    zB

    # Wert kummulierte Summe
    1 20 20
    2 50 70
    ... ... ...

    Problematisch ist auch, dass der Datensatz nicht geordnet ist, so dass das der im Code auch zuerst geordnet werden muss...

    Danke und Grüße

  • #2
    Hallo,

    die Aufgabe kann mittels eines Cursors und Schleifen gelöst werden.

    [highlight=sql]
    CREATE TABLE test
    (
    ID int IDENTITY,
    Wert int,
    Summe int DEFAULT NULL
    );

    INSERT INTO test(Wert, Summe) VALUES (20, NULL);
    INSERT INTO test(Wert, Summe) VALUES (10, NULL);
    INSERT INTO test(Wert, Summe) VALUES (50, NULL);

    -------------------------------------------------------------------------------
    -- Ordnen der Datensätze:

    -- Geordnetes Einfügen in eine temp. Tabelle:
    SELECT Wert, Summe
    INTO #tmp
    FROM test
    ORDER BY Wert

    -- löschen der Werte in der ungeordneten Tabelle:
    TRUNCATE TABLE test

    -------------------------------------------------------------------------------
    DECLARE @Wert int;
    DECLARE @Summe int;
    DECLARE @kumSum int;
    SET @kumSum = 0;

    -- Mittels CURSOR die Kumulationen berechnen:
    DECLARE curKumulation CURSOR
    FORWARD_ONLY
    FOR SELECT Wert, Summe FROM #tmp;
    OPEN curKumulation;

    -- 1. Wert lesen -> damit FETCH_STATUS abgefragt werden kann:
    FETCH NEXT FROM curKumulation
    INTO @Wert, @Summe;

    -- Daten mit einer Schleife durchlaufen und kumulieren:
    WHILE @@FETCH_STATUS = 0
    BEGIN
    -- kumulierte Summe berechnen:
    SET @kumSum = @kumSum + @Wert;

    -- kumulierte Summe in Tabelle schreiben:
    UPDATE #tmp
    SET Summe = @kumSum
    WHERE CURRENT OF curKumulation;

    -- nächster Wert:
    FETCH NEXT FROM curKumulation
    INTO @Wert, @Summe
    END
    -- Cursor schließen und Resourcen freigeben:
    DEALLOCATE curKumulation;

    -- Schreiben der Werte von der #tmp in test:
    INSERT INTO test
    SELECT Wert, Summe
    FROM #tmp

    -- Kontrollausgabe:
    SELECT * FROM test

    DROP TABLE #tmp;
    DROP TABLE test;
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,

      mein 1. Versuch war noch nicht ausgereift.

      Es geht auch kürzer/einfacher:
      [highlight=sql]
      CREATE TABLE #tmp
      (
      ID int IDENTITY,
      Wert int,
      Summe int DEFAULT NULL
      );

      INSERT INTO #tmp(Wert, Summe) VALUES (20, NULL);
      INSERT INTO #tmp(Wert, Summe) VALUES (10, NULL);
      INSERT INTO #tmp(Wert, Summe) VALUES (50, NULL);

      -- Möglichkeit 1: Über Inner-Join und GroupBy:
      SELECT t1.ID, t1.Wert, SUM(t2.Wert) AS Summe
      FROM #tmp AS t1
      JOIN #tmp AS t2
      ON t2.Wert <= t1.Wert
      GROUP BY t1.ID, t1.Wert
      ORDER BY t1.Wert

      -- Möglichkeit 2: Unterabfrage:
      SELECT ID, Wert, (
      SELECT SUM(Wert)
      FROM #tmp AS t2
      WHERE t2.Wert <= t1.Wert
      ) AS Summe
      FROM #tmp AS t1
      ORDER BY t1.Wert

      DROP TABLE #tmp
      [/highlight]

      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Hi,

        Vielen vielen Dank für die ausführliche Antwort! Muss ich denn diese temporäre Tabelle erstellen. Habe bereits eine Spalte in der benötigten Tabelle, nur dass dieser nicht nach ID geordnet ist.

        Ist bei bestehender Spalte immer noch der Insert Befehl gültig oder muss ich den Update Befehl nutzen?

        Nochmals Danke

        Comment


        • #5
          Hallo,

          verwende von meinem 2. Post eine der Möglichkeiten - da wird keine temp. Tabelle mehr benötigt.

          Ich persönlich ziehe die Variante mit dem JOIN vor, da der Ausführungsplan besser gespeichert werden kann und somit die Abfrage performanter ist.

          Der 1. Versuch war ein Schnellschuss und ging "daneben".

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment

          Working...
          X