![]() |
Datenbank: AbsComponent • Version: 7.9 • Zugriff über: SQL-Query
SQL- Summe je Zeile bilden - kummuliert
Liste der Anhänge anzeigen (Anzahl: 1)
Datenbank ist: Absolute Database
Hallo, irgendwie stehe ich jetzt voll daneben :wall: :glaskugel: ich möchte per SQL Summen je Zeile bilden, diese soll kumuliert sein. - Ich habe 3 Werte je Zeile. Diese sollen addiert werden und dieser Wert soll ich die 4. Spalte eingetragen werden. - Falls kein Wert vorhanden ist, soll in dieser 4. Spalte der Wert von der vorherigen Zeile eingetragen werden. - Fall ein Wert in der nächsten Zeile ist, so sollen diese Werte addiert werden und zum vorherigen Wert addiert werden, der dann in der 4. Spalte steht. - SIEHE ANHANG ... da sind die Abstände besser dargestellt. Zeile Spalte1 Spalte2 Spalte3 Spalte4(Ergebnis per SQL eintragen) 1 100,00 2.500,00 300,00 2.900,00 2 100,00 3.000,00 3 3.000,00 (kein Eintrag ... wert von vorheriger Zeile übernehmen) 4 50,00 100,00 3.150,00 Also irgendwie geht das nicht. :-( Ich dachte, ich löse das am Besten mit SQL, denn dann geht es schneller, denn ich habe eine Jahrestabelle (365 Zeilen). Könnte mir bitte da jemand helfen oder weiß jemand, wie man das am Besten macht? Vorab vielen vielen Dank. |
AW: SQL- Summe je Zeile bilden - kummuliert
Das ist nicht ganz trivial.
Was ist ABSComponent für eine Datenbank? Zitat:
Summiere 3 Spalten und addiere es auf die Summe der vorigen Zeile. Der zweite Teil dieser Anforderung nennt sich auch "running total". Mit dem ersten Teil gibt es vermutlich keine Probleme. "..vorige Zeile.." Mit SQL kann man nicht ohne weiteres auf die vorige Zeile zugreifen. SQL arbeitet Mengen basiert und kennt keine Reihenfolge. Es gibt Erweiterungen, die solche "Spreadsheet" Funktionen bieten, aber das kommt auf das Produkt an. Man kann die vorige Zeile rausfinden, mit SQL, dafür braucht man aber eine eindeutige ID je Zeile und ein Kriterium, das die "Vorigkeit" definiert. P.S.: Wenn es sich um Absolute Database handelt, diese DB kann das wahrscheinlich nicht. Wenn es (immer) nur um 365 Datensätze geht, braucht man es nicht mit SQL zu machen, sondern kann es im Programm berechen (auch wenn SQL bequemer wäre) Wenn es um mehr geht und diese Anforderung oben nur der Anfang ist, sollte man nach einer anderen DB schauen. Z.B. Firebird, die lässt sich auch embedded nutzen und kann sowas wie Du oben nachgefragt hast per explizitem SQL, bequem und schnell. (Ein Sortierkriterium, also eine weitere Spalte, die solch ein Kriterium liefert, braucht man da aber auch.) |
AW: SQL- Summe je Zeile bilden - kummuliert
Hallo und Danke für Deine Antwort,
nun, die Datenbank ist so ähnlich wie das frühere Paradox, aber halt einfach besser und viel einfacher, was die Anlage von Datenbanken ect betrifft. Ich war immer sehr zufrieden damit. :-) Der Link zur Seite: ![]() Nun zu Deiner Frage: Eindeutig ist die ID, die je Zeile ja eindeutig erzeugt und auch fortlaufend ist. zu der : "Kriterium, das die "Vorigkeit" definiert" ... mhhh... kann man die "Werte" je Zeile nicht irgendwie durch eine Variable oder extra Spalte definieren? Du meintest, mit dem Ersten Teil gibt es keine Probleme. - Wie könnte ich das realisieren? und geht das mit einer "laufenden" Variable nicht? Es sind zwar "nur" 365 Zeilen, aber angenommen, in der 10 Zeile ändert man den Wert, müssen alle anderen 355 Zeilen angepasst und durchgerechnet, und der Wert je Tag ja angepasst werden. Es wird halt vorher schon viel berechnet und da wollte ich das Ganze ggf. nicht noch länger hinausziehen, bis der Wert oder besser gesagt die Werte alle angepasst sind. |
AW: SQL- Summe je Zeile bilden - kummuliert
Nur so am Rande bemerkt:
Zitat:
|
AW: SQL- Summe je Zeile bilden - kummuliert
Ich konnte es jetzt auch nicht direkt ausbessern. Habe es aber oben vermerkt.
Hatte das geschrieben, weil es eben von dieser Firma ist. |
AW: SQL- Summe je Zeile bilden - kummuliert
Also ohne jetzt das Problem und die DBE genauer zu kennen, könnt ich mir irgendwas in dieser Art vorstellen:
Code:
Sowas sollte in etwa den gewünschten Erfolg haben, glaube ich. Müsste das mal
SELECT
t1.id, t1.col1, t1.col2, t1.col3, (SELECT SUM(t2.col4) WHERE t2.id <= t1.id FROM table AS t2) AS xyz FROM table AS t1 Schnell mit irgendeiner Beispieltabelle durchlaufen lassen. Gruß Daniel |
AW: SQL- Summe je Zeile bilden - kummuliert
Vielen Dank, ich versuche es gleich mal. :-)
|
AW: SQL- Summe je Zeile bilden - kummuliert
Da wir den konkreten Aufbau der DB und die Abfrage nicht kennen müßen wir im unge0fähren bleiben.
Zunächst ist die ID nur der Identifier eines Datensatzes und hat nichts mit den anderen Datensätzen zu tun. Nehmen wir an Du hast folgende Abfrage:
SQL-Code:
dann erhältst Du die erste Summe mit
Select wert1,wert2,wert3 from myDB
SQL-Code:
Was den "vorherigen" Datensatz angeht, den gibt es nicht solange Du die Ergebnisdatensätze nicht sortierst. Erst dann liegt eine verlässliche Reihenfolge vor, vorausgesetzt das Sortierkriterium ist für jeden Datensatz eindeutig.
Select wert1,wert2,wert3,(wert1+wert2+wert3) as summe1 from myDB
In Deinem Beispiel sieht es so aus, als gäbe es Datensätze in denen nicht alle Felder einen Wert ethalten, diesen müßte zuerst z.B. mit Coalesce ein Wert zugewiesen werden. Gruß K-H |
AW: SQL- Summe je Zeile bilden - kummuliert
Danke für Deine Antwort. Ich habe es versucht und hat auch geklappt. Nur zeigt er mir leider den Wert an und schreibt
ihn nicht in die DB hinein. Ich vermute, ich muss das irgendwie anders lösen. Dankeschön trotzdem. |
AW: SQL- Summe je Zeile bilden - kummuliert
Ein "Select" selektiert Daten,
ein "Insert" fügt Daten ein. Kombiniert man ein "Insert" und ein "Select", so fügt man selektierte Daten ein, jenachdem eine bis viele Zeilen. Dann gibt es noch das "Update", damit werden einzelne Spalten in bestehenden Datensätzen aktualisiert. Dazu solltest Du Dir vielleicht mal irgendwo ein kleines Grundlagentutorial anschauen. Und zuletzt: Normalerweise trägt man keine Daten in eine Tabelle ein, die man genauso auch per purem Selektstatement berechnen kann. Du hast selbst weiter oben von "Änderungen ab dem 10. Datensatz mit dem daraus folgenden Neuberechnungsaufwand" geschrieben. Man selektiert also nur dynamisch und berechnet die benötigten Daten ad hoc. So stimmen sie immer zum Zeitpunkt der Anzeige. Es gibt natürlich auch immer wieder Gründe, es anders zu machen. Es kommt halt drauf an... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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