Hallo allerseits und vielen Dank für Ihre Hilfe.
Ich habe die folgende Situation: eine Tabelle namens Anweisungen, die die Felder ID (int), stmnt_date (Datum), Lastschrift (doppelt), Gutschrift (doppelt) und Saldo (doppelt) enthält.
Ich möchte den Saldo nach folgenden Regeln berechnen:
Der Saldo der ersten Zeile ( chronologisch ) = Lastschrift - Gutschrift und für den Rest der Zeilen
aktueller Zeilensaldo = chronologisch vorheriger Zeilensaldo + aktuelle Zeilenbelastung - aktuelles Zeilenguthaben
Wie Sie auf dem Bild oben sehen können, sind die Zeilen nicht nach Datum geordnet. Deshalb habe ich das Wort zweimal chronologisch verwendet, um die Bedeutung des Werts stmnt_date hervorzuheben.
Vielen Dank für Ihre Hilfe.
CREATE TABLE
Anweisungen und Beispieldaten (mitINSERT
) hinzu.Antworten:
Unter der Annahme, dass dies
stmnt_date
eineUNIQUE
Einschränkung hat, wäre dies mit Fenster- / Analysefunktionen ziemlich einfach:Leider hat MySQL (noch) keine Analysefunktionen implementiert. Sie können das Problem entweder mit striktem SQL lösen, indem Sie die Tabelle selbst verbinden (was ziemlich ineffizient sein sollte, obwohl es zu 100% funktioniert) oder indem Sie eine bestimmte MySQL-Funktion verwenden, Variablen (die recht effizient wären, aber Sie müssten sie testen Stellen Sie beim Upgrade von MySQL sicher, dass die Ergebnisse immer noch korrekt sind und nicht durch Optimierungsverbesserungen beeinträchtigt werden.
Mit Ihren Daten ergibt sich:
quelle
Ich denke, Sie könnten Folgendes versuchen:
quelle
Die Antwort von ypercube ist ziemlich spektakulär (ich hatte noch nie eine Variablenerstellung innerhalb einer einzelnen Abfrage über eine solche Dummy-Auswahl gesehen). Hier ist also die Anweisung CREATE TABLE.
Für tabellarische Datenbilder in der Google Bildsuche können Sie https://convertio.co/ocr/ oder https://ocr.space/ verwenden , um sie in ein Textdokument zu konvertieren. Wenn die OCR die Spalten nicht richtig erkannt hat und Sie einen Mac haben, verwenden Sie TextWrangler mit gedrückter Optionstaste, um eine rechteckige Auswahl durchzuführen und die Spalten zu verschieben. Die Kombination aus SQL-Editor wie Sequel Pro , TextWrangler und einer Tabelle wie Google Text & Tabellen macht den Umgang mit tabulatorgetrennten Tabellendaten äußerst effizient.
Wenn ich all dies in einen Kommentar einfügen könnte, würde ich diese Antwort bitte nicht positiv bewerten.
quelle
Selbstverbindende Tische sind bei großen Tischen nicht sehr schnell. Als ich mich mit dieser Aufgabe unter PostgreSQL befasste, entschied ich mich, die Triggerfunktion zur Berechnung des gespeicherten Feldes "balance" zu verwenden. Alle Berechnungen werden nur einmal für jede Zeile durchgeführt.
quelle
In MSSQL zum Beispiel:
Verwenden Sie eine with () -Anweisung, um einen CTE zu generieren. Dies ist im Wesentlichen eine temporäre Ergebnismenge, die den Wert jeder Zeile anzeigt. Sie können math in der with-Anweisung verwenden, um am Ende eine Spalte zu erstellen. Mit math können Sie anzeigen, dass die Gesamtsumme der Zeile DEBIT-CREDIT ist. In Ihrer with-Anweisung müssen Sie jeder Zeile Zeilennummern zuweisen. Verwenden Sie die OVER-Klausel von WITH (), um nach stmnt_date zu sortieren.
Verbinden Sie dann die Tabelle rekursiv mit a.ROWNUMBER = b.ROWNUMBER-1 oder +1 auf sich selbst, wodurch Sie auf a.total + b.total = total dieser Zeile und der vorherigen Zeile verweisen können.
Ich schätze, dass ich den Code nicht zur Verfügung stelle, aber dies ist die praktische Methode, um dies zu erreichen. Ich kann auf Anfrage Code angeben :)
quelle