Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL Summen - Listen bilden (https://www.delphipraxis.net/150094-mysql-summen-listen-bilden.html)

Mavarik 7. Apr 2010 08:31

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:

Bernhard Geyer 7. Apr 2010 08:43

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.

rapante 7. Apr 2010 08:44

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:
 UPDATE tabelle SET summe = (SELECT SUM(Betrag) FROM tabelle) WHERE 1=1;
Wenn ich es richtig verstanden habe, hast du für jeden Datensatz die Summe der Beträge
aller Datensätze gespeichert?!
In diesem Fall solltest du deine Tabellenstruktur nochmals überdenken.
(Es sei denn du speicherst die Summe aus Performancegründen :wink: )

Mavarik 7. Apr 2010 08:45

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von Bernhard Geyer
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.

Hallo Bernhard...

1. Nicht verstanden :stupid:
2. Wie und was bringt eine 2. Tabelle :stupid:

Mavarik :stupid:

Mavarik 7. Apr 2010 08:48

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von rapante
Hallo Mavarick
Wenn ich es richtig verstanden habe, hast du für jeden Datensatz die Summe der Beträge
aller Datensätze gespeichert?!
In diesem Fall solltest du deine Tabellenstruktur nochmals überdenken.
(Es sei denn du speicherst die Summe aus Performancegründen :wink: )

NEIN...

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

rapante 7. Apr 2010 08:56

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;

Mavarik 7. Apr 2010 09:19

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:
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
Wenn ich die -50,00 vom 02.01.2000 auf + 50 ändere müssen alle Datensätze danach
um den Betrag von 100,00 geändert werden.

Mavarik

DeddyH 7. Apr 2010 09:39

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;

Mavarik 7. Apr 2010 09:49

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von DeddyH
Ich hab von Triggern in MySQL keine Ahnung, aber möglicherweise könnte das so funktionieren

OK Das funktioniert sicherlich... Aber dauert ewig, oder?

Mavarik

rapante 7. Apr 2010 09:51

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

DeddyH 7. Apr 2010 09:52

Re: MySQL Summen - Listen bilden
 
Erstens das und zweitens fällt mir gerade ein, dass dann der Trigger ja rekursiv weiter feuern würde.

rapante 7. Apr 2010 10:05

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von Mavarik
Man könnte das mit einem Kontoauszug vergleichen, nur das der sich laufend ändert...

Mmmh... da du den Vergleich mit einem Kontoauszug bringst:
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...

Mavarik 7. Apr 2010 12:32

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von rapante
Mmmh... da du den Vergleich mit einem Kontoauszug bringst:
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...

Nein die Anwendung ist eine andere und deswegen geht genau das nicht....

Hat jemand vielleicht ne Idee wie man das als StoredProcedure lösen kann - hab ich noch NIE versucht...

Bringt das einen Geschwindigkeitzuwachs?

Mavarik

DeddyH 7. Apr 2010 12:45

Re: MySQL Summen - Listen bilden
 
Vielleicht hilft Dir dieses Tutorial weiter: http://www.tutorials.de/forum/sql-tu...mysql-5-a.html

omata 7. Apr 2010 15:21

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von Mavarik
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.

Was verbirgt sich hinter "Liste"? Wie werden deine Daten zur Zeit angezeigt? Über ein DBGrid?

Mavarik 7. Apr 2010 15:45

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von omata
Was verbirgt sich hinter "Liste"? Wie werden deine Daten zur Zeit angezeigt? Über ein DBGrid?

Ja

omata 7. Apr 2010 16:16

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)?

Mavarik 7. Apr 2010 16:21

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

omata 7. Apr 2010 16:30

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.

Mavarik 12. Apr 2010 15:29

Re: MySQL Summen - Listen bilden
 
Zitat:

Zitat von omata
Das war nicht ganz die Frage, aber so wie sich das anhört, führen die schon genannten Lösungen zum Erfolg.

Leider nicht!

Weil:

Innerhalb der Datenbank gibt es Unterkonto mit eigenen Nummernkreis die jeweils einen eigenen Saldo haben...

Ich brauche also sowas wie:

SQL-Code:
FOR EACH ROW
// Wenn Nummernkreis <> Lastnummerkreis then saldo := 0;
Komme einfach nicht weiter.

Mavarik :wall:

mkinzler 12. Apr 2010 23:04

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;

Mavarik 14. Apr 2010 13:46

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 06:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz