Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Gleiche Datensätze "addieren" (https://www.delphipraxis.net/57536-gleiche-datensaetze-addieren.html)

davar 22. Nov 2005 21:31

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

omata 22. Nov 2005 21:40

Re: Gleiche Datensätze "addieren"
 
Sollte so gehen,

SQL-Code:
SELECT ort, datum, SUM(anzahl)
FROM tabelle
GROUP BY ort, datum
MfG
Thorsten

davar 4. Dez 2005 20:29

Re: Gleiche Datensätze "addieren"
 
Zitat:

Zitat von omata
Sollte so gehen,

SQL-Code:
SELECT ort, datum, SUM(anzahl)
FROM tabelle
GROUP BY ort, datum
MfG
Thorsten

Super! Danke! :thumb:

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

etom291272 4. Dez 2005 20:35

Re: Gleiche Datensätze "addieren"
 
einfach eine where clausel hinzu und eventuell mit cast die zeit alleine eingrenzen oder nur stunden von bis

davar 4. Dez 2005 20:48

Re: Gleiche Datensätze "addieren"
 
Zitat:

Zitat von etom291272
einfach eine where clausel hinzu und eventuell mit cast die zeit alleine eingrenzen oder nur stunden von bis

Cast ist für mich ein neuer Begriff, werde mich darüber mal schlau machen. Aber mit WHERE grenze ich doch die Abfrage ein. Ich möchte aber die komplette Tabelle in einer Art Zusammenfassung.

omata 4. Dez 2005 21:43

Re: Gleiche Datensätze "addieren"
 
Hallo,

Zitat:

Zitat von davar
1. Wie wird die Anzahl ausgegeben? (z.B. in ein Label) Die anderen Sachen bekomme ich ja mit Fieldbyname.

SQL-Code:
SELECT ort, datum, SUM(anzahl) AS anzahl
FROM tabelle
GROUP BY ort, datum
gib der Summenspalte einen Namen (AS Name), dann kannst du auch über FieldByName drauf zugreifen.

Zitat:

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

Da muss ich erstmal mit einer Gegenfrage kommen. Was für Uhrzeiten sind den in der Datenbank?
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

davar 5. Dez 2005 10:39

Re: Gleiche Datensätze "addieren"
 
Zitat:

Zitat von omata
Zitat:

Zitat von davar
1. Wie wird die Anzahl ausgegeben? (z.B. in ein Label) Die anderen Sachen bekomme ich ja mit Fieldbyname.

Da muss ich erstmal mit einer Gegenfrage kommen. Was für Uhrzeiten sind den in der Datenbank?
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

Du hast es schon richtig verstanden, ich habe es nicht ganz korrekt dargestellt.

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.

marabu 5. Dez 2005 11:39

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:
SELECT b1.id AS id1, b2.id AS id2, b1.ziel, b1.datum, b1.zeit, () as dtDelta
FROM buchungen b1, buchungen b2
Der Ausdruck für dtDelta könnte dann so oder ähnlich aussehen:

SQL-Code:
CAST(b1.datum AS datetime) + CAST(b1.zeit AS datetime) - CAST(b2.datum AS datetime) - CAST(b2.zeit AS datetime)
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.

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