Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie mehrere Datensätze m.gleichen Feldwerten zusammenführen? (https://www.delphipraxis.net/85473-wie-mehrere-datensaetze-m-gleichen-feldwerten-zusammenfuehren.html)

AirJordan 31. Jan 2007 11:06

Datenbank: Absolute Datebase • Version: 4.89 • Zugriff über: Absolute Database/Dataset

Wie mehrere Datensätze m.gleichen Feldwerten zusammenführen?
 
Hallo,

ich habe mal eine Frage. Gegeben sei eine temporäre Importdatenbanktabelle. Diese soll mit einer CSV Datei, die von einem anderen Programm erstellt wird, gefüllt werden und später in einem Datengitter angezeigt werden.

Diese CSV Datei sieht wie folgt aus:

Zitat:

[..]
"01.01.2007","13:20","100","",""
"01.01.2007","13:20","","5",""
"01.01.2007","15:00","90","",""
"01.01.2007","16:30","","","6"
"01.01.2007","20:00","123","",""
"01.01.2007","20:00","","8",""
"01.01.2007","20:00","","","1"
[..]
usw
Jetzt werden die einzelnen Zeilen der CSV Datei als je ein Datensatz in die temp. Importtabelle geschrieben. Ich möchte aber die Daten, die z.b. alle um 20:00 an einem Tag waren, als ein! Datensatz geschrieben haben.

Wie löst man dies am sinnvollsten??

Ich habe bis jetzt eine

Delphi-Quellcode:
dataset.first
while not dataset.eof do
begin
  lese_ein;
  dataset.next;
end;
Man könnte nach "lese_ein" einfach einen Datensatz weiter schauen und dort überprüfen, ob das gleiche Datum und die gleiche Uhrzeit vorhanden ist und dann die Daten zusammenführen. Leider sind es mal zwei und mal drei gleiche Datensätze. Vier und mehr ist zwar ganz selten, kann aber auch theoretisch vorkommen.

Kann man das vielleicht über SQL Befehle lösen? Oder gibt es da noch andere Lösungswege?

Schon mal danke für eure Tipps und Hinweise.

marabu 31. Jan 2007 11:26

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Hallo Holger,

probiere es mal mit SELECT * FROM Tabelle GROUP BY Datum, Zeit, MAX(Wert1), MAX(Wert2), MAX(Wert3) ...

Freundliche Grüße

AirJordan 31. Jan 2007 15:48

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Hallo Achim,

vielen Dank für die Infos :thumb: , werde das heute Abend mal ausprobieren.

AirJordan 2. Feb 2007 09:09

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Hallo noch mal,

mit der SQL Abfrage hat das nicht geklappt, weil die Absolute Database vielleicht den SQL MAX Befehl u.U so nicht unterstützt und weil die Daten in den einzelnen Spalten bei gleicher Uhrzeit und Datum auch mal mehrfach vorkommen können (siehe Beispiel).

Das hatte ich vorher aber in der CSV Datei nicht entdecken können.

Zitat:

[..]
"01.01.2007","20:00","123","",""
"01.01.2007","20:00","","8",""
"01.01.2007","20:00","","2",""
[..]
Ich versuche nun doch mit einem Next und einem Vergleich auf Datum und Uhrzeit die "doppelten"
rauszufiltern. :gruebel:

mkinzler 2. Feb 2007 09:17

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Ich möchte aber die Daten, die z.b. alle um 20:00 an einem Tag waren, als ein! Datensatz geschrieben haben.
Als Maximum, Durchschnitt, Summe?
SQL-Code:
SELECT datum, zeit, Sum(Wert1), ..., Sum(Wertx) FROM Tabelle GROUP BY Datum, Zeit;

Hansa 2. Feb 2007 09:47

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Lege zuerst mal eine Stored Procedure in der DB an. Meine Glaskugel meint, mit "zusammenführen" sei eine Addition gemeint, eventuell auch ein Überschreiben. So lange das nicht gesagt wurde, macht eine genaue Antwort keinen Sinn. Deshalb bur kurz skizziert :

1. Daten einlesen
2. Übergabe an Parameter der SP

innerhalb der SP :

anhand der Input Parameter Datum und Uhrzeit mit einem SELECT suchen, ob was gleiches da ist.
Falls nicht : INSERT. Anderennfalls UPDATE und für eine Addition wäre dann noch so eine Zeile nötig :

SQL-Code:
SET FELDX = FELDX + :PARAM;

AirJordan 2. Feb 2007 09:59

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Sorry, ich klare die Glaskugel mal etwas auf. :oops:

Es ist nicht sinnvoll die Daten mit gleichem Datum und gleicher Uhrzeit in z.B. zwei,
drei oder mehr Datensätzen abzuspeichern. Das verwirrt den Anwender. Ich möchte also
nicht eine Summe, einen Durchschnitt oder ähnliches der Spalten bilden, ich möchte nur
aus zwei oder drei Datensätzen einen! Datensatz machen. (wenn Datum und Uhrzeit exakt
gleich). :???:

Hoffe ich habe jetzt die Situation besser beschrieben.

mkinzler 2. Feb 2007 10:18

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

ich möchte nur
aus zwei oder drei Datensätzen einen! Datensatz machen.
Mit welchem Wert dann?

AirJordan 2. Feb 2007 10:28

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Aus diesem Beispiel würde dann...

Zitat:

"01.01.2007","20:00","123","",""
"01.01.2007","20:00","","8",""
"01.01.2007","20:00","","2",""
"10.01.2007","20:00","","","2"
Zitat:

"01.01.2007","20:00","123","10","2"
...entstehen.

Grund: die 123 ist ein Blutzuckerwert, die 8 und die 2 sind Insulinmengen und die 2
sind gegessene Broteinheiten (BE). Die 8 und die 2 sind deshalb zwei Einträge, weil
man zum Beispiel 8 Einheiten für die 2 BE und noch mal 2 Einheiten Insulin als
Korrektur für die "zu hohen" 123 spritzen muss. In meiner Software werden die aber
als 10 geführt.

Diabetiker unter uns verzeihen mir bitte die etwas unrealistischen Werte... :zwinker:

mkinzler 2. Feb 2007 10:31

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Dann stimmt doch sum() da 8+2 = 10

Hansa 2. Feb 2007 10:35

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Nun gut, es interesiert also lediglich das Datum und die Uhrzeit und alles andere ist egal ? Das können auch Zufallswerte sein oder was ? :shock: Wie bereits gesagt : SP, die internern ermittelt, ob ein Datensatz mit gleichem Datum/Uhrzeit vorhanden ist und dann UPDATE. Falls nicht vorhanden : INSERT.

wg. roter Kasten : Oh je, ich sage besser nichts mehr. 8) :mrgreen: Deshalb ohne Gewähr : in dem nachgelieferten Beispiel ist die 123 der erste Wert. Um nur den abzuspeichern, entfiele in der SP lediglich der UPDATE-Zweig.

VORHANDEN = -1;
SELECT ID FROM BLABLA WHERE (DATUM = :DATUM AND UHRZEIT = :UHRZEIT) INTO :VORHANDEN;
IF VORHANDEN < 0 THEN
INSERT ...

AirJordan 2. Feb 2007 11:36

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von mkinzler
Dann stimmt doch sum() da 8+2 = 10

Dann würde aus vier Datensätzen ein! Datensatz mit der folgenden SQL Anweisung entstehen?!

SQL-Code:
SELECT Datum, Zeit, Sum(BZ), Sum(INSULIN), Sum(BE), INSULUIN_NAME, STATUS FROM DataImport GROUP BY Datum, Zeit;
Dann habe ich danach folgendes in der DataImport:

Zitat:

"01.01.2007","20:00","123","10","2","RAPID","1 0"
Werde das heute Abend noch mal ausprobieren.

AirJordan 2. Feb 2007 11:42

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von Hansa
Nun gut, es interesiert also lediglich das Datum und die Uhrzeit und alles andere ist egal ? Das können auch Zufallswerte sein oder was ?

Naja Zufallswerte sind das alles nicht, sie kommen aus einer anderen Software in der die
Werte ebenfalls eingegeben werden können.

Zitat:

Zitat von Hansa
wg. roter Kasten : Oh je, ich sage besser nichts mehr. 8) :mrgreen:

Welcher rote Kasten? :gruebel:

Zitat:

Zitat von Hansa
Deshalb ohne Gewähr : in dem nachgelieferten Beispiel ist die 123 der erste Wert. Um nur den abzuspeichern, entfiele in der SP lediglich der UPDATE-Zweig.

VORHANDEN = -1;
SELECT ID FROM BLABLA WHERE (DATUM = :DATUM AND UHRZEIT = :UHRZEIT) INTO :VORHANDEN;
IF VORHANDEN < 0 THEN
INSERT ...

Werde ich mal austesten.

marabu 2. Feb 2007 11:59

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Hallo Holger,

bei mir funktioniert das ausgezeichnet:

Delphi-Quellcode:
begin
  with Query do
  begin
    SQL.Text := 'select datum, zeit, max(bz) as bz, sum(ie) as ie, sum(be) as be '
              + 'into tageswerte from messwerte group by datum, zeit';
    ExecSQL;

    SQL.Text := 'select * from tageswerte order by datum, zeit';
    Open;
    // ...
    Close;
  end;
Freundliche Grüße

mkinzler 2. Feb 2007 12:01

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
@Achim du hast aber ursprünglich was anderes geschrieben:
Zitat:

SQL-Code:
SELECT * FROM Tabelle GROUP BY Datum, Zeit, MAX(Wert1), MAX(Wert2), MAX(Wert3) ...


marabu 2. Feb 2007 12:59

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Hallo Markus,

zu dem Zeitpunkt war die Anforderung ein simples folding - da war es egal, ob man Max(), Min() oder Sum() verwendet. Später hat Holger erklärt, dass er auch noch akkumulieren muss, weshalb ich die für mich erkenntlichen Werte auf Sum() umgestellt habe.

Freundliche Grüße

mkinzler 2. Feb 2007 13:03

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Nein ich meinte der Unterschied zwischen Feldliste und Gruppierungsliste

marabu 2. Feb 2007 13:10

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Meinst du die Felder Wert1, Wert2, Wert3? Ich hatte mir inzwischen eine Testdatenbank erzeugt, wobei ich die Felder eigenwillig benannt habe, aber eigentlich wollte ich mit Beitrag #14 nur einen Machbarkeitsbeweis angesichts der Negativmeldung in Beitrag #4 antreten.


Edit: Ach Scheibenkleister - jetzt weiß ich was du meinst. Muss ich blind gewesen sein. So sorry.

AirJordan 2. Feb 2007 16:28

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von marabu
Hallo Holger,

bei mir funktioniert das ausgezeichnet:

Delphi-Quellcode:
begin
  with Query do
  begin
    SQL.Text := 'select datum, zeit, max(bz) as bz, sum(ie) as ie, sum(be) as be '
              + 'into tageswerte from messwerte group by datum, zeit';
    ExecSQL;

    SQL.Text := 'select * from tageswerte order by datum, zeit';
    Open;
    // ...
    Close;
  end;
Freundliche Grüße

Hallo Achim,

hmmm :gruebel: irgendwie geht das mit den SQL Befehlen in der Absolute Datebase noch nicht.
Wenn ich mit dem Group Befehl Datum und Zeit einbinde, meckert die Datenbank mit folgenden
Hinweis:

Zitat:

Field is not included in GROUP BY list. Table name = '', Field name = 'INSULIN_NAME', FieldNo = 8, Found field name = 'INSULIN_NAME' - Native error: 10342
Wenn ich dann alle mit SELECT gewählten Felder in die Gruppenliste einfüge, kommt zwar keine Fehlermeldung,
aber das SQL Ergebnis enthält genau die gleiche Anzahl Datensätze wie die ursprüngliche Importtabelle. :?

mkinzler 2. Feb 2007 16:29

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Die Felder müßen entweder in der Gruppierung sein oder als Aggregat (Min, Max, AVG, Sum, ...)

AirJordan 2. Feb 2007 16:41

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von mkinzler
Die Felder müßen entweder in der Gruppierung sein oder als Aggregat (Min, Max, AVG, Sum, ...)

:thumb: Bingo das war´s. Was mach ich dann mit dem Feld das den Namen des Insulin enthält?
SUM, AVG etc bringt da ja nichts. :wink: Einfach in die Gruppe?

*Edit*: Wenn ich das Feld mit dem Insulinnamen in den GROUP Befehl einfügen, werden es wieder
zwei Datensätze mehr, die dann keine sinnvollen Daten enthalten.

mkinzler 2. Feb 2007 16:49

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Versuch es mal MIN oder gibt es ABS ein First o.ä Aggregat? sonst könntest du die Spalte in einem 2. Schritt dazujoinen

AirJordan 2. Feb 2007 16:54

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von mkinzler
Versuch es mal MIN oder gibt es ABS ein First o.ä Aggregat? sonst könntest du die Spalte in einem 2. Schritt dazujoinen

Wieder BINGO. :thumb: Mit MIN hat es geklappt. Großes Dankschön an Dich und marabu. :cheers: Und Hansa für den
anderen Lösungsweg.

Hansa 2. Feb 2007 16:58

Re: Wie mehrere Datensätze m.gleichen Feldwerten zusammenfüh
 
Zitat:

Zitat von AirJordan
*Edit*: Wenn ich das Feld mit dem Insulinnamen in den GROUP Befehl einfügen, werden es wieder zwei Datensätze mehr, die dann keine sinnvollen Daten enthalten.

Ist ja schön, wenn einige im Nebel rumstochern wollen. Nur was ist jetzt genau ? Was heißt "zusammenführen" ? Was ist der Zweck ? :shock: Die Felder Datum und Uhrzeit sind klar, aber was ist mit den anderen ? Hilfreich wäre auch, einmal die Tabellenstruktur zu zeigen. Auf meinen Vorschlag, die DB entscheiden zu lassen, ein Insert oder ein Update zu machen ging ja keiner ein. Geht es jetzt um Summenbildung etc. oder darum, nicht alles mehrfach zu speichern ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 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