![]() |
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
Gleiche Datensätze "addieren"
Hallo Leute,
nun habe ich ein eher logisches Problem. Ich habe eine Datenbank und möchte nun die Datensätze zusammenrechnen. Besser an einem Beispiel, Auszug aus der (Beispiel-)Datenbank: Name / Datum / Zielort / Anzahl Fahrgäste Müller / 01.11.2005 / Frankfurt / 2 Meier / 02.11.2005 / Berlin / 2 Schmidt / 01.11.2005 / Frankfurt / 5 Henzel / 05.11.2005 / München / 3 Köhler / 02.11.2005 / Berlin / 4 Jetzt möchte ich die Leute ermitteln, die am gleichen Datum zum gleichen Ort fahren, und da jeweils die Anzahl der Fahrgäste zusammenzählen. Also, Müller und Schmidt fahren beide am 01.11.2005 nach Frankfurt, insgesamt 7 Fahrgäste. Meier und Köhler fahren am 02.11.2005 nach Berlin, insgesamt 6 Fahrgäste. Und Henzel fährt am 05.11.2005 nach München, insgesamt 3 Fahrgäste. Folgende Ausgabe brauche ich: Frankfurt, 01.11.2005, 7 Fahrgäste Berlin, 02.11.2005 6 Fahrgäste München, 05.11.2005, 3 Fahrgäste Derzeit habe ich es mit tausenden if..then Abfragen "gelöst" und zum Schluss läuft es doch nicht richtig. Bin mir aber fast sicher, dass es eine elegantere Möglichkeit gibt. Jemand ne Ahnung? MfG davar |
Re: Gleiche Datensätze "addieren"
Sollte so gehen,
SQL-Code:
MfG
SELECT ort, datum, SUM(anzahl)
FROM tabelle GROUP BY ort, datum Thorsten |
Re: Gleiche Datensätze "addieren"
Zitat:
Was hab ich mir nur für 'ne Arbeit gemacht mit so vielen Verzweigungen.. Nun komme ich jedoch an zwei Sachen nicht vorbei. 1. Wie wird die Anzahl ausgegeben? (z.B. in ein Label) Die anderen Sachen bekomme ich ja mit Fieldbyname. 2. Wie ist es, wenn ich die Uhrzeit berücksichtigen möchte? Es sollen nur die zusammen gruppiert werden, die nicht länger als 2 Stunden auseinander sind. Wenn am gleichen Datum mehrere Leute den gleichen Ort anfahren möchten, jedoch eine Gruppe z.B. um 12 Uhr und eine zweite um 15 Uhr, dann sollen diese auch getrennt gezählt und später angezeigt werden. MfG davar |
Re: Gleiche Datensätze "addieren"
einfach eine where clausel hinzu und eventuell mit cast die zeit alleine eingrenzen oder nur stunden von bis
|
Re: Gleiche Datensätze "addieren"
Zitat:
|
Re: Gleiche Datensätze "addieren"
Hallo,
Zitat:
SQL-Code:
gib der Summenspalte einen Namen (AS Name), dann kannst du auch über FieldByName drauf zugreifen.
SELECT ort, datum, SUM(anzahl) AS anzahl
FROM tabelle GROUP BY ort, datum Zitat:
Wenn dort steht A:12:58, B:14:02, C:14:58, D:15:02 was willst du jetzt wie raus bekommen? A, B und C liegen innerhalb von 2 Stunden. B, C und D liegen aber auch innerhalb von 2 Stunden. Dann würde man ja B/C zweimal zählen. Könntest du da nochmal etwas genauer was zusagen. Vielleicht verstehe ich das ja auch nur falsch. MfG Thorsten |
Re: Gleiche Datensätze "addieren"
Zitat:
In diesem Fall: der erste Datensatz bekommt den Termin 12:58, also der früheste an dem Tag. In diesen Datensatz kommen alle Daten bis einschl. 14:57 hinein, also A und B. C und D kämen in den nächsten Datensatz hinein. |
Re: Gleiche Datensätze "addieren"
Hallo davar,
dein Problem ist etwas zu komplex um es mit einem LOCALSQL Statement zu lösen. Ich denke, dass das Mengengerüst darüber entscheidet, ob sich ein vollständig optimierter Tourenplan lohnt oder nicht. Die einfachste Lösung scheint mir ein Report zu sein. Ich würde verschachtelte Gruppen für ORT und DATUM definieren und die innen laufende DATUM Gruppe nach Zeitfenster partitionieren. Die Erstellung eines optimierten Tourenplans ist dann schon etwas komplexer. Da kommen dann auch noch ein paar Parameter hinzu, wie Transportkapazität, Wegezeiten, Rüstzeiten, Fahrer. Um das mit SQL zu lösen sollte es schon ein vollwertiges SQL sein. Du wirst eine Weile brauchen bist du alle Teilschritte als mengentheoretische Probleme formuliert hast, um ein passendes SQL Statement angeben zu können. Das von Thorsten schon hinterfragte Entscheidungsproblem existiert wirklich, kann aber erstmal ausklammert werden. Du brauchst jedenfalls ein Kreuzprodukt über deiner Tabelle BUCHUNGEN (ID, ZIEL, DATUM, ZEIT) um die Zeitabstände zu ermitteln:
SQL-Code:
Der Ausdruck für dtDelta könnte dann so oder ähnlich aussehen:
SELECT b1.id AS id1, b2.id AS id2, b1.ziel, b1.datum, b1.zeit, () as dtDelta
FROM buchungen b1, buchungen b2
SQL-Code:
Ich bin aber sicher, dass du mit LOCALSQL und einem Report Generator am schnellsten und besten zum Ziel kommst. Hängt natürlich alles auch von den genauen Anforderungen ab, aber schon allein die inter-record Abhängigkeiten bei der Partitionierung würdest du aus Performanzgründen auch in SQL iterativ angehen.
CAST(b1.datum AS datetime) + CAST(b1.zeit AS datetime) - CAST(b2.datum AS datetime) - CAST(b2.zeit AS datetime)
Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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