hallodri69
Goto Top

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

Content-ID: 133868

Url: https://administrator.de/contentid/133868

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

StefanLausL
StefanLausL 20.01.2010 um 09:23:50 Uhr
Goto Top
Moing,

also Access hab ich ich schon lange nicht mehr gemacht deswegen hier mal ein Select wie er in SQL aussehen müsste um die richtigen Daten zu bekommen.

SELECT G
,MAX(B) B
FROM
Zieltabelle
GROUP BY G
KUBLIdata
KUBLIdata 20.01.2010 um 10:12:17 Uhr
Goto Top
SELECT G, MAX(B) AS Bmax
FROM Quelltabelle
GROUP BY G

Die letzte Antwort war gut, aber ohne das "AS" in Zeile 1 geht nix.
StefanLausL
StefanLausL 20.01.2010 um 10:26:02 Uhr
Goto Top
Also SQL-Server stört sich nicht an dem fehlendem "AS" !

Aber egal !
hallodri69
hallodri69 20.01.2010 um 15:14:07 Uhr
Goto Top
da sind noch andere felder und funktionen drin und irgendwie beißen die sich. es kommt die fehlemeldung "sie haben eine unterabfrage erstellt die mehr als ein feld zurückgeben kann, ohne das reservierte wort EXISTS im FROM-abschnitt der hauptabfrage zu vermeiden. überarbeiten sie die select anweisung der unterabfrage, damit nur ein feld abgerufen wird"

SELECT A, B, C, Date-Diff("m",Date(),E) AS MonateSeit, F INTO Zieltabelle
FROM Quelltabelle
WHERE (((bmax)=(SELECT G, MAX(B) as Bmax FROM Quelltabelle group by G)))
ORDER BY G
Biber
Biber 20.01.2010 um 16:01:08 Uhr
Goto Top
Moin hallodri69,

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)))
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
StefanLausL
StefanLausL 20.01.2010 um 16:16:26 Uhr
Goto Top
Einfach die Quelltabelle mit dem Unterselect der den Max Eintrag findet joinen.
So z.B.


SELECT *
FROM Quelltabelle quelle
JOIN
(SELECT G, MAX(B) as Bmax FROM Quelltabelle group by G)t
ON t.G = quelle.G AN t.Bmax = quelle.B
KUBLIdata
KUBLIdata 20.01.2010 um 18:30:56 Uhr
Goto Top
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;
hallodri69
hallodri69 21.01.2010 um 11:44:22 Uhr
Goto Top
EDIT:
Dann kommt ne Fehlermeldung "die Insert to Anweisung enthält folgenden unbekannten Feldnamen "Zieltabelle.G".Stellen Sie sicher, daß sie den namen richtig angegeben haben...

Aber das ist der Feldname der Zieltabelle.
KUBLIdata
KUBLIdata 21.01.2010 um 11:53:29 Uhr
Goto Top
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)
hallodri69
hallodri69 21.01.2010 um 12:17:51 Uhr
Goto Top
ich arbeite noch dran ;) ich komme der sache langsam näher.....
hallodri69
hallodri69 21.01.2010 um 13:40:31 Uhr
Goto Top
die abfrage klappte an sich schon mal. er gibt ne zieltabelle aus in der zwei spalten drin sind, einmal die spalte G und eine mit dem Bmax. schon mal gut. nur brauche ich natürlich noch zusätzlich felder aus der quelltabelle (ohne berechnungen, einafch nu7r angezeigt) und die wollte ich jetzt einfach in der sql-abfrage ergänzen, synonym zu dem feld G zum beispiel. aber da kommt folgende fehlermeldung:

"sie wollten eine abfrage ausführen, die den angegebenen ausdruck "xy" nicht als teil der aggregatfunktion einschließt". hä??

der aktuelle code (XY ist das neue einzufügende feld):
INSERT INTO zieltabelle(G,Bmax,XY)
SELECT quelltabelle.G, max(quelltabelle.B) AS Bmax,quelltabelle.XY
FROM quelltabelle
GROUP BY quelltabelle.G

das feld XY habe ich aber bereits in der zieltabelle eingefügt als textfeld und das ist es auch in der quelltabelle.
KUBLIdata
KUBLIdata 21.01.2010 um 14:08:11 Uhr
Goto Top
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 face-smile
hallodri69
hallodri69 21.01.2010 um 14:31:19 Uhr
Goto Top
das mit dem ersten beispiel geht nicht, denn da gruppert er nicht nur G, sondern auch nach dem neuen feld XY. es sollte ja aber von dem feldinhalt in G jeweils nur ein einziger datensatz in der zieltabelle sein und jetzt kommt er mehrfach vor, je nach XY. ich will aber, daß er das feld XY einfach nur anzeigt. keine gruppeirung, keine summe.

aber trotzdem danke, wenn sie hier aussteigen wollen, denn es wäre noch komlizierter geworden (da neue anforderung) und mein hirn steigt auch schon langsam aus....
Biber
Biber 21.01.2010 um 17:26:29 Uhr
Goto Top
Moin hallodri69,

wenn dich schon so eine Drömelabfrage nervlich belastet, dann solltest du mal mit meiner Ex-Schwiegermutti zum Winterschlussverkauf gehen...face-wink

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
hallodri69
hallodri69 25.01.2010 um 09:08:57 Uhr
Goto Top
Zitat von @Biber:
Moin hallodri69,

wenn dich schon so eine Drömelabfrage nervlich belastet, dann solltest du mal mit meiner Ex-Schwiegermutti zum
Winterschlussverkauf gehen...face-wink

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

hallo biber,
die abfrage läuft zwar durch, aber das ergebnis ist falsch. es kommen immer mehrere, ich sag mal "unnatürlich viele" (6-8) datensätze pro G raus und der wert Bmax stimmt auch nicht (siehe ergebnistabelle). übrigens, hab das distinct eingefügt. ausschnitt aus dem ergebnis:  

G	B
5002 | 	05.08.2009
5002 | 	05.08.2009
5002 | 	05.08.2009
5002 | 	05.08.2009
5002 | 	05.08.2009
5003 | 	31.08.2009
5003 | 	31.08.2009
5003 | 	31.08.2009
5003 | 	31.08.2009
5003 | 	31.08.2009
5004 | 	24.04.2007
5004 | 	24.04.2007
5004 | 	24.04.2007
5004 | 	24.04.2007
5004 | 	24.04.2007
5010 | 	18.11.2009
5010 | 	18.11.2009
5010 | 	18.11.2009
5010 | 	18.11.2009
5010 | 	18.11.2009
5013 | 	21.02.2005
5013 | 	21.02.2005
5013 | 	21.02.2005
5013 | 	21.02.2005
5013 | 	21.02.2005
5015 | 	24.03.2009
5015 | 	24.03.2009
5015 | 	24.03.2009
5015 | 	24.03.2009
5015 | 	24.03.2009
5016 | 	08.05.2007
5016 | 	08.05.2007
5016 | 	08.05.2007
5016 | 	08.05.2007
5016 | 	08.05.2007
5021 | 	13.01.2009
5021 | 	13.01.2009
5021 | 	13.01.2009
5021 | 	13.01.2009
5021 | 	13.01.2009
5022 | 	24.11.2004
5022 | 	24.11.2004
5022 | 	24.11.2004
5022 | 	24.11.2004
5022 | 	24.11.2004
5024 | 	04.02.2003
5024 | 	04.02.2003
5024 | 	04.02.2003
5024 | 	04.02.2003
5024 | 	04.02.2003
5028 | 	30.06.2009
5028 | 	30.06.2009
5028 | 	30.06.2009
5028 | 	30.06.2009
5028 | 	30.06.2009
5029 | 	02.11.2009
5029 | 	02.11.2009
5029 | 	02.11.2009
5029 | 	02.11.2009
5029 | 	02.11.2009
5034 | 	25.09.2008
5034 | 	25.09.2008
5034 | 	25.09.2008
5034 | 	25.09.2008
5034 | 	25.09.2008
5037 | 	02.09.2009
5037 | 	02.09.2009
5037 | 	02.09.2009
5037 | 	02.09.2009
5037 | 	02.09.2009
5041 | 	29.06.2009
5041 | 	29.06.2009
5041 | 	29.06.2009
5041 | 	29.06.2009
5041 | 	29.06.2009
 

> 

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
Biber
Biber 25.01.2010 um 09:56:20 Uhr
Goto Top
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:
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
...ein akzeptableres Ergebnis?

Grüße
Biber
hallodri69
hallodri69 01.02.2010 um 07:58:01 Uhr
Goto Top
ja face-smile

danke nochmal an alle.