AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Gleiche Datensätze "addieren"
Thema durchsuchen
Ansicht
Themen-Optionen

Gleiche Datensätze "addieren"

Ein Thema von davar · begonnen am 22. Nov 2005 · letzter Beitrag vom 5. Dez 2005
Antwort Antwort
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#1

Gleiche Datensätze "addieren"

  Alt 22. Nov 2005, 21:31
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Gleiche Datensätze "addieren"

  Alt 22. Nov 2005, 21:40
Sollte so gehen,

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

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Gleiche Datensätze "addieren"

  Alt 4. Dez 2005, 20:29
Zitat von omata:
Sollte so gehen,

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

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
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#4

Re: Gleiche Datensätze "addieren"

  Alt 4. Dez 2005, 20:35
einfach eine where clausel hinzu und eventuell mit cast die zeit alleine eingrenzen oder nur stunden von bis
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Gleiche Datensätze "addieren"

  Alt 4. Dez 2005, 20:48
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Gleiche Datensätze "addieren"

  Alt 4. Dez 2005, 21:43
Hallo,

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 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
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Gleiche Datensätze "addieren"

  Alt 5. Dez 2005, 10:39
Zitat von omata:
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Gleiche Datensätze "addieren"

  Alt 5. Dez 2005, 11:39
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:

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 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