![]() |
Datenbank: MySQL • Version: 5.x • Zugriff über: SciBit Komponenten Direkt
MySQL Summen - Listen bilden
Hallo Zusammen, an alle (My)SQL freaks... ;-)
Ich habe folgende Problemstellung: Datum Nr Betrag Summe (Sortiert nach Datum,Nummer) Eine einfache Datenbank... Leider mit recht vielen Datensätzen. In diese Liste sollen an beliebigen Stellen (Datum) Datensätze eingefügt/gelöscht werden oder Betrag die in der List stehen sollen verändert werden. Aufgabenstellung ist, dass "augenblicklicht" alle Summen der folgenden Datensätze wieder den "richtigen" Wert haben. Was ist hierfür der beste Weg? Grüsse Mavarik :mrgreen: |
Re: MySQL Summen - Listen bilden
Mein Vorschlag:
Redundante Tabelle die diese Summenwerte beinhalten und ein Trigger auf die ursprüngliche Tabelle der dann die Summenwerte in der redundanten Tabelle aktualisiert. |
Re: MySQL Summen - Listen bilden
Hallo Mavarick
Das kannst du über ein Update-Statement realisieren. Das müsste dann ungefähr so aussehen:
SQL-Code:
Wenn ich es richtig verstanden habe, hast du für jeden Datensatz die Summe der Beträge
UPDATE tabelle SET summe = (SELECT SUM(Betrag) FROM tabelle) WHERE 1=1;
aller Datensätze gespeichert?! In diesem Fall solltest du deine Tabellenstruktur nochmals überdenken. (Es sei denn du speicherst die Summe aus Performancegründen :wink: ) |
Re: MySQL Summen - Listen bilden
Zitat:
1. Nicht verstanden :stupid: 2. Wie und was bringt eine 2. Tabelle :stupid: Mavarik :stupid: |
Re: MySQL Summen - Listen bilden
Zitat:
Man könnte das mit einem Kontoauszug vergleichen, nur das der sich laufend ändert... Es soll jeder Betrag's Eintrag den Saldo bis zu diesem Tag mitführen. Mavarik |
Re: MySQL Summen - Listen bilden
dann eben so:
SQL-Code:
UPDATE tabelle t1 SET t1.summe = (SELECT SUM(t2.Betrag) FROM tabelle t2 WHERE t2.datum <= t1.datum AND t2.nr < t1.nr) WHERE 1=1;
|
Re: MySQL Summen - Listen bilden
Also entweder verstehe ich es nicht mit t1 und t2 oder ich drücke mich falsch aus.
Hier nochmal ein Beispiel:
SQL-Code:
Wenn ich die -50,00 vom 02.01.2000 auf + 50 ändere müssen alle Datensätze danach
01.01.2000 +100,00 +100,00
02.01.2000 - 50,00 + 50,00 03.01.2000 -300,00 -250,00 04.01.2000 +100,00 -150,00 05.01.2000 +100,00 - 50,00 06.01.2000 +100,00 + 50,00 um den Betrag von 100,00 geändert werden. Mavarik |
Re: MySQL Summen - Listen bilden
Ich hab von Triggern in MySQL keine Ahnung, aber möglicherweise könnte das so funktionieren:
SQL-Code:
new.Saldo = old.Saldo + (new.Betrag - old.Betrag);
UPDATE Tabelle SET Saldo = Saldo + (new.Betrag - old.Betrag) WHERE Datum > new.Datum; |
Re: MySQL Summen - Listen bilden
Zitat:
Mavarik |
Re: MySQL Summen - Listen bilden
t1 & t2 sind nur aliase für die tabelle, weil die selbe Tabelle 2 mal verwendet wird.
das Updatestatement würde alle Summen(Salden) der Tabelle aktualisieren. Das geht sicherlich auch performanter, aber das Beispiel ist auch nur als Denkanstoß gedacht :-D |
Re: MySQL Summen - Listen bilden
Erstens das und zweitens fällt mir gerade ein, dass dann der Trigger ja rekursiv weiter feuern würde.
|
Re: MySQL Summen - Listen bilden
Zitat:
Wäre es nicht sinvoller, anstatt eine Änderung an einem Betrag(Buchung?) vorzunehmen eine Gegenbuchung durchzuführen. Dann hättest du zum Einen das Problem mit der Summenaktualisierung nicht und zum Anderen auch eine Historie... |
Re: MySQL Summen - Listen bilden
Zitat:
Hat jemand vielleicht ne Idee wie man das als StoredProcedure lösen kann - hab ich noch NIE versucht... Bringt das einen Geschwindigkeitzuwachs? Mavarik |
Re: MySQL Summen - Listen bilden
Vielleicht hilft Dir dieses Tutorial weiter:
![]() |
Re: MySQL Summen - Listen bilden
Zitat:
|
Re: MySQL Summen - Listen bilden
Zitat:
|
Re: MySQL Summen - Listen bilden
Ok und wie viele Daten werden angezeigt? Kann man das Nachladen der Daten, die im DBGrid angezeigt werden zügig durchführen oder dauert das auch schon zu lange?
Aber die Daten müssen auf jeden Fall auch in der DB geändert werden (alle nachfolgenden, nicht nur der aktuell geänderte)? |
Re: MySQL Summen - Listen bilden
Da immer alle Summen und Salden berechnet sind ist das Anzeigen nur ein Select *
Eine Änderung von Datensatz 3 hat also Auswirkung auf alle folgenden 230.000 Datensätze. Mavarik |
Re: MySQL Summen - Listen bilden
Das war nicht ganz die Frage, aber so wie sich das anhört, führen die schon genannten Lösungen zum Erfolg.
|
Re: MySQL Summen - Listen bilden
Zitat:
Weil: Innerhalb der Datenbank gibt es Unterkonto mit eigenen Nummernkreis die jeweils einen eigenen Saldo haben... Ich brauche also sowas wie:
SQL-Code:
Komme einfach nicht weiter.
FOR EACH ROW
// Wenn Nummernkreis <> Lastnummerkreis then saldo := 0; Mavarik :wall: |
Re: MySQL Summen - Listen bilden
Hier sollte IIF()/IF() oder CASE..WHEN hilfreich sein
SQL-Code:
UPDATE
Tabelle SET Saldo = IIF( Nummernkreis <> Lastnummerkreis, Saldo + (new.Betrag - old.Betrag), 0) WHERE Datum > new.Datum; |
Re: MySQL Summen - Listen bilden
Hi!
ICH :wall: Habe jetzt endlich geblickt, warum das so nicht funktioniert... Diese SQL Anweisung geht davon aus, dass die Datensatze schon ein vorberechnetes Saldo haben... Das ist nicht der Fall... Saldo ist vorher für alle "reihen" 0.00 Mavarik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz