Datensätze vergleichen und einen rausselektieren für Abfrage
hallo,
ich hab in access xp eine ausgangstabelle, die sieht so aus:
G | B
5002 | 05-Aug-09
5003 | 13-Mrz-09
5003 | 14-Feb-08
5003 | 14-Dez-07
5010 | 18-Nov-09
5015 | 09-Mrz-09
5015 | 25-Jan-06
5016 | 06-Feb-07
5021 | 13-Jan-09
5028 | 30-Jun-09
5029 | 02-Nov-09
5029 | 31-Mai-07
5037 | 02-Sep-09
5037 | 03-Jun-08
5037 | 18-Okt-07
5041 | 29-Jun-09
ich will eine abfrage machen, die nur die datensätze ausgibt, die innerhalb desselben wertes in spalte g in der spalte b das aktuellste datum haben. die tabelle soll von oben nach unten basierend auf den werten der spalte g vergleichen werden.
beispiel: wert 5002 gibt's nur einmal, also den direkt übernehmen, da kein vergleich notwendig. von dem wert 5003 gibt es in spalte g drei datensätze und es soll der datensatz durch die abfrage gefunden werden, der innerhalb der datensätze mit 5003 das aktuellste datum in spalte b hat, also in den fall der mit 13. märz 2009. also soll für die wertegruppe 5003 dieser datensatz ausgegeben werden. dann soll die abfrage weiterspringen. 5010 gibt's nur einmal, also den direkt nehmen. bei 5015 gibt's wieder zwei, also wieder vergleichen und den mit 9.3.2009 nehmen usw. usw.
zieltabelle:
G | B
5002 | 05-Aug-09
5003 | 13-Mrz-09
5010 | 18-Nov-09
5015 | 09-Mrz-09
5016 | 06-Feb-07
5021 | 13-Jan-09
5028 | 30-Jun-09
5029 | 02-Nov-09
5037 | 02-Sep-09
5041 | 29-Jun-09
ich hab in access xp eine ausgangstabelle, die sieht so aus:
G | B
5002 | 05-Aug-09
5003 | 13-Mrz-09
5003 | 14-Feb-08
5003 | 14-Dez-07
5010 | 18-Nov-09
5015 | 09-Mrz-09
5015 | 25-Jan-06
5016 | 06-Feb-07
5021 | 13-Jan-09
5028 | 30-Jun-09
5029 | 02-Nov-09
5029 | 31-Mai-07
5037 | 02-Sep-09
5037 | 03-Jun-08
5037 | 18-Okt-07
5041 | 29-Jun-09
ich will eine abfrage machen, die nur die datensätze ausgibt, die innerhalb desselben wertes in spalte g in der spalte b das aktuellste datum haben. die tabelle soll von oben nach unten basierend auf den werten der spalte g vergleichen werden.
beispiel: wert 5002 gibt's nur einmal, also den direkt übernehmen, da kein vergleich notwendig. von dem wert 5003 gibt es in spalte g drei datensätze und es soll der datensatz durch die abfrage gefunden werden, der innerhalb der datensätze mit 5003 das aktuellste datum in spalte b hat, also in den fall der mit 13. märz 2009. also soll für die wertegruppe 5003 dieser datensatz ausgegeben werden. dann soll die abfrage weiterspringen. 5010 gibt's nur einmal, also den direkt nehmen. bei 5015 gibt's wieder zwei, also wieder vergleichen und den mit 9.3.2009 nehmen usw. usw.
zieltabelle:
G | B
5002 | 05-Aug-09
5003 | 13-Mrz-09
5010 | 18-Nov-09
5015 | 09-Mrz-09
5016 | 06-Feb-07
5021 | 13-Jan-09
5028 | 30-Jun-09
5029 | 02-Nov-09
5037 | 02-Sep-09
5041 | 29-Jun-09
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 133868
Url: https://administrator.de/contentid/133868
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
17 Kommentare
Neuester Kommentar
Moin hallodri69,
Ich meine, es ist schön, dass du uns an den Gedanken teilhaben lässt, die dir so beim Lesen einer Fehlermeldung durch den Kopf oder vergleichbare Körperteile ziehen, aber... können wir denn etwas tun? Helfen? Beitragen? Mitfühlen?
Die Fehlermeldung
oder allgemeiner: "....WHERE einfeld = Select einFeld, zweitesFeld from whereEver".
Kann nicht gehen und würde ich auch nicht machen.
Ein " Where EXISTS (bmax = SELECT max(B) from ebenDa group by....)" wäre angebrachter, wenn die Verknüpfung nur über ein Feld gehen sollte.
Wenn es über zwei Felder geht, wäre ein SubSelect und ein Join über zwei Felder sinnvoller.
Grüße
Biber
da sind noch andere felder und funktionen drin und irgendwie beißen die sich.
In welchem Film bist du denn jetzt und kannst du uns dahin irgendwie mitnehmen/reinschmuggeln?Ich meine, es ist schön, dass du uns an den Gedanken teilhaben lässt, die dir so beim Lesen einer Fehlermeldung durch den Kopf oder vergleichbare Körperteile ziehen, aber... können wir denn etwas tun? Helfen? Beitragen? Mitfühlen?
Die Fehlermeldung
...sie haben eine unterabfrage erstellt die mehr als ein feld zurückgeben kann...
ist doch verständlich... kannst du doch so wie sie ist laut übern Bahnhofsvorplatz rufen und alle nicken verständnisvoll. ... WHERE (((bmax)=(SELECT G, MAX(B) as Bmax FROM Quelltabelle group by G)))
Kann nicht gehen und würde ich auch nicht machen.
Ein " Where EXISTS (bmax = SELECT max(B) from ebenDa group by....)" wäre angebrachter, wenn die Verknüpfung nur über ein Feld gehen sollte.
Wenn es über zwei Felder geht, wäre ein SubSelect und ein Join über zwei Felder sinnvoller.
Grüße
Biber
Also:
Das Ganze heisst jetzt
INSERT INTO Zieltabelle (Zieltabelle.G, Zieltabelle.BMAX) 'hier muss die Anzahl Felder und deren Reihenfolge genau gleich sein wie...
SELECT G, MAX(B) AS Bmax '...hier
FROM Quelltabelle
GROUP BY G
Wichtig ist, dass die Zieltabellen-Felder gleiche Typen aufweisen und dass die Zieltabelle bereits existiert.
Falls die Zieltabelle anfangs geleert werden müsste:
Das Sql der Abfrage muss heissen: DELETE FROM Zieltabelle;
Das Ganze heisst jetzt
INSERT INTO Zieltabelle (Zieltabelle.G, Zieltabelle.BMAX) 'hier muss die Anzahl Felder und deren Reihenfolge genau gleich sein wie...
SELECT G, MAX(B) AS Bmax '...hier
FROM Quelltabelle
GROUP BY G
Wichtig ist, dass die Zieltabellen-Felder gleiche Typen aufweisen und dass die Zieltabelle bereits existiert.
Falls die Zieltabelle anfangs geleert werden müsste:
Das Sql der Abfrage muss heissen: DELETE FROM Zieltabelle;
Die Feldnamen in der Zieltabelle prüfen!!!! Und alle Worte 'zieltabelle' an die richtigen Tabellennamen anpassen. Ebenfalls für 'Quelltabelle'
Wenn Kein Feld 'bmax' exitstiert, dann kommt die Meldung halt.
(Ich kann solche Aufgaben auch über meine Firma erledigen. Kostet dann allerdings auch etwas. Dafür funktioniert es dann garantiert korrekt)
Wenn Kein Feld 'bmax' exitstiert, dann kommt die Meldung halt.
(Ich kann solche Aufgaben auch über meine Firma erledigen. Kostet dann allerdings auch etwas. Dafür funktioniert es dann garantiert korrekt)
Das ist ganz logisch.
Wenn man aus einer Tabelle Aggregate wie Max, Min, Avg etc. verwendet, dann handelt es sich immer um eine gruppierte Abfrage.
Es ist dann nur noch möglich, ebenfalls aggregierte Werte einzufügen.
Falls alle Felder die gleichen Werte aufweisen, kann das Feld bei GROUP BY angefügt werden, wenn nicht kann z.B. First(Feldname) AS XY verwendet werden, das ist aber
selten sinnvoll, da auch nur ein (manchmal zufälliger) Wert verwendet wird.
Versuchen Sie mal eine Abfrage hinzukriegen, die einfach läuft. Ohne in eine andere Tabelle abzufüllen.
Lassen Sie hierzu die Zeile mit "INSERT INTO..." eingfach weg.
Wenn die Abfrage genau das Resultat liefert, welches gewünscht ist, kann anschliessend mit den tatsächlich ausgegebenen Feldnamen wieder eine Zeile oben angefügt werden.
Ich will trotzdem zwei fertige Beispiele anfügen (laufen 100%ig):
INSERT INTO zieltabelle (G,Bmax,XY)
SELECT G, max(B) AS Bmax, XY
FROM quelltabelle
GROUP BY G, XY
oder Wenn das Feld xy als Summe ausgeben werden sollte:
INSERT INTO zieltabelle (G,Bmax,SXY)
SELECT G, max(B) AS Bmax, sum(XY) AS SXY
FROM quelltabelle
GROUP BY G
Ich hoffe es dient der Sache etwas. Sonst empfehle ich ein bischen Access Lernen (online) es gibt überall Syntaxhilfen und ich empfehle auch Siten www.donkarl.com oder andere. Früher brauchte ich das auch mal
Wenn man aus einer Tabelle Aggregate wie Max, Min, Avg etc. verwendet, dann handelt es sich immer um eine gruppierte Abfrage.
Es ist dann nur noch möglich, ebenfalls aggregierte Werte einzufügen.
Falls alle Felder die gleichen Werte aufweisen, kann das Feld bei GROUP BY angefügt werden, wenn nicht kann z.B. First(Feldname) AS XY verwendet werden, das ist aber
selten sinnvoll, da auch nur ein (manchmal zufälliger) Wert verwendet wird.
Versuchen Sie mal eine Abfrage hinzukriegen, die einfach läuft. Ohne in eine andere Tabelle abzufüllen.
Lassen Sie hierzu die Zeile mit "INSERT INTO..." eingfach weg.
Wenn die Abfrage genau das Resultat liefert, welches gewünscht ist, kann anschliessend mit den tatsächlich ausgegebenen Feldnamen wieder eine Zeile oben angefügt werden.
Ich will trotzdem zwei fertige Beispiele anfügen (laufen 100%ig):
INSERT INTO zieltabelle (G,Bmax,XY)
SELECT G, max(B) AS Bmax, XY
FROM quelltabelle
GROUP BY G, XY
oder Wenn das Feld xy als Summe ausgeben werden sollte:
INSERT INTO zieltabelle (G,Bmax,SXY)
SELECT G, max(B) AS Bmax, sum(XY) AS SXY
FROM quelltabelle
GROUP BY G
Ich hoffe es dient der Sache etwas. Sonst empfehle ich ein bischen Access Lernen (online) es gibt überall Syntaxhilfen und ich empfehle auch Siten www.donkarl.com oder andere. Früher brauchte ich das auch mal
Moin hallodri69,
wenn dich schon so eine Drömelabfrage nervlich belastet, dann solltest du mal mit meiner Ex-Schwiegermutti zum Winterschlussverkauf gehen...
Versuch es so.
P.S. Eventuell gibt es (das kannst nur du beantworten) u.U. zwei Datensätze in der Quelltabelle, die den Wert Max(B) bezogen auf eine Gruppierung G haben.
Wenn du davon nur einen INSERTen willst, dann noch ein zusätzliches DISTINCT hinter das erste SELECT-Wort setzen.
Grüße
Biber
wenn dich schon so eine Drömelabfrage nervlich belastet, dann solltest du mal mit meiner Ex-Schwiegermutti zum Winterschlussverkauf gehen...
Versuch es so.
INSERT INTO zieltabelle(G, Bmax, XY)
SELECT qEinzel.G, q.Einzel.b, qEinzel.xy
FROM quelltabelle as qEinzel,
( Select G, max(B) AS Bmax FROM Quelltabelle GROUP BY G) as qKumu
Where qEinzel.G = qkumu.G
AND qEinzel.b =qKumu.bmax
P.S. Eventuell gibt es (das kannst nur du beantworten) u.U. zwei Datensätze in der Quelltabelle, die den Wert Max(B) bezogen auf eine Gruppierung G haben.
Wenn du davon nur einen INSERTen willst, dann noch ein zusätzliches DISTINCT hinter das erste SELECT-Wort setzen.
Grüße
Biber
Moin hallodri69,
wenn es in deiner Quelltabelle tatsächlich mehrere Datensätze mit z.B. G=5002 und einem max(b) bzw.bmax =05.08.2009 geben sollte,
aber mit unterschiedlichem Inhalt des Feldes XY, dann nützt in der Tat das schnste Distinct nichts.. da geb ich dir recht.
Dann ist jedoch für eine sinnvolle Query die Aussage zu hinterfragen:
Denn wenn das Verhalten so ist wie beschrieben, dann müssten eigentlich sowohl die GROUP BY-Clause wie auch der JOIN um das Feld xyMax (o.ä.) erweistert werden.
Liefert denn
...ein akzeptableres Ergebnis?
Grüße
Biber
wenn es in deiner Quelltabelle tatsächlich mehrere Datensätze mit z.B. G=5002 und einem max(b) bzw.bmax =05.08.2009 geben sollte,
aber mit unterschiedlichem Inhalt des Feldes XY, dann nützt in der Tat das schnste Distinct nichts.. da geb ich dir recht.
Dann ist jedoch für eine sinnvolle Query die Aussage zu hinterfragen:
ich will aber, daß er das feld XY einfach nur anzeigt. keine gruppeirung, keine summe.
Ja nun.... irgendein konkreter Wert für XY muss aber in die Zieltabelle eingefügt werden... willst du bei mehreren gleichen G/Bmax-Kombinationen im Feld Zieltabelle.XY den höchsten, den ersten, den durchschnittlichen...?Denn wenn das Verhalten so ist wie beschrieben, dann müssten eigentlich sowohl die GROUP BY-Clause wie auch der JOIN um das Feld xyMax (o.ä.) erweistert werden.
Liefert denn
SELECT qEinzel.G, qEinzel.b, qEinzel.xy
FROM quelltabelle as qEinzel,
( Select G, max(B) AS Bmax, max(xy) as XYmax FROM Quelltabelle GROUP BY G) as qKumu
Where qEinzel.G = qkumu.G
AND qEinzel.b =qKumu.bmax
AND qEinzel.XY=qKumu.XYmax
Grüße
Biber