Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Datensätze vergleichen und einen rausselektieren für Abfrage

Frage Microsoft Microsoft Office

Mitglied: hallodri69

hallodri69 (Level 1) - Jetzt verbinden

20.01.2010, aktualisiert 16:15 Uhr, 8062 Aufrufe, 17 Kommentare

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
Mitglied: StefanLausL
20.01.2010 um 09:23 Uhr
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
Bitte warten ..
Mitglied: KUBLIdata
20.01.2010 um 10:12 Uhr
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.
Bitte warten ..
Mitglied: StefanLausL
20.01.2010 um 10:26 Uhr
Also SQL-Server stört sich nicht an dem fehlendem "AS" !

Aber egal !
Bitte warten ..
Mitglied: hallodri69
20.01.2010 um 15:14 Uhr
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
Bitte warten ..
Mitglied: Biber
20.01.2010 um 16:01 Uhr
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.
01.
 ... 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
Bitte warten ..
Mitglied: StefanLausL
20.01.2010 um 16:16 Uhr
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
Bitte warten ..
Mitglied: KUBLIdata
20.01.2010 um 18:30 Uhr
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;
Bitte warten ..
Mitglied: hallodri69
21.01.2010 um 11:44 Uhr
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.
Bitte warten ..
Mitglied: KUBLIdata
21.01.2010 um 11:53 Uhr
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)
Bitte warten ..
Mitglied: hallodri69
21.01.2010 um 12:17 Uhr
ich arbeite noch dran ;) ich komme der sache langsam näher.....
Bitte warten ..
Mitglied: hallodri69
21.01.2010 um 13:40 Uhr
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.
Bitte warten ..
Mitglied: KUBLIdata
21.01.2010 um 14:08 Uhr
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
Bitte warten ..
Mitglied: hallodri69
21.01.2010 um 14:31 Uhr
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....
Bitte warten ..
Mitglied: Biber
21.01.2010 um 17:26 Uhr
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.
01.
INSERT INTO zieltabelle(G, Bmax, XY) 
02.
SELECT qEinzel.G, q.Einzel.b, qEinzel.xy  
03.
FROM quelltabelle as qEinzel,  
04.
( Select G,  max(B) AS Bmax FROM Quelltabelle GROUP BY G) as qKumu 
05.
Where qEinzel.G = qkumu.G 
06.
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
Bitte warten ..
Mitglied: hallodri69
25.01.2010 um 09:08 Uhr
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...

Versuch es so.
01.
> INSERT INTO zieltabelle(G, Bmax, XY) 
02.
> SELECT qEinzel.G, q.Einzel.b, qEinzel.xy  
03.
> FROM quelltabelle as qEinzel,  
04.
> ( Select G,  max(B) AS Bmax FROM Quelltabelle GROUP BY G) as qKumu 
05.
> Where qEinzel.G = qkumu.G 
06.
> AND qEinzel.b =qKumu.bmax 
07.
 
08.
hallo biber, 
09.
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: 
10.
 
11.
G	B 
12.
5002 | 	05.08.2009 
13.
5002 | 	05.08.2009 
14.
5002 | 	05.08.2009 
15.
5002 | 	05.08.2009 
16.
5002 | 	05.08.2009 
17.
5003 | 	31.08.2009 
18.
5003 | 	31.08.2009 
19.
5003 | 	31.08.2009 
20.
5003 | 	31.08.2009 
21.
5003 | 	31.08.2009 
22.
5004 | 	24.04.2007 
23.
5004 | 	24.04.2007 
24.
5004 | 	24.04.2007 
25.
5004 | 	24.04.2007 
26.
5004 | 	24.04.2007 
27.
5010 | 	18.11.2009 
28.
5010 | 	18.11.2009 
29.
5010 | 	18.11.2009 
30.
5010 | 	18.11.2009 
31.
5010 | 	18.11.2009 
32.
5013 | 	21.02.2005 
33.
5013 | 	21.02.2005 
34.
5013 | 	21.02.2005 
35.
5013 | 	21.02.2005 
36.
5013 | 	21.02.2005 
37.
5015 | 	24.03.2009 
38.
5015 | 	24.03.2009 
39.
5015 | 	24.03.2009 
40.
5015 | 	24.03.2009 
41.
5015 | 	24.03.2009 
42.
5016 | 	08.05.2007 
43.
5016 | 	08.05.2007 
44.
5016 | 	08.05.2007 
45.
5016 | 	08.05.2007 
46.
5016 | 	08.05.2007 
47.
5021 | 	13.01.2009 
48.
5021 | 	13.01.2009 
49.
5021 | 	13.01.2009 
50.
5021 | 	13.01.2009 
51.
5021 | 	13.01.2009 
52.
5022 | 	24.11.2004 
53.
5022 | 	24.11.2004 
54.
5022 | 	24.11.2004 
55.
5022 | 	24.11.2004 
56.
5022 | 	24.11.2004 
57.
5024 | 	04.02.2003 
58.
5024 | 	04.02.2003 
59.
5024 | 	04.02.2003 
60.
5024 | 	04.02.2003 
61.
5024 | 	04.02.2003 
62.
5028 | 	30.06.2009 
63.
5028 | 	30.06.2009 
64.
5028 | 	30.06.2009 
65.
5028 | 	30.06.2009 
66.
5028 | 	30.06.2009 
67.
5029 | 	02.11.2009 
68.
5029 | 	02.11.2009 
69.
5029 | 	02.11.2009 
70.
5029 | 	02.11.2009 
71.
5029 | 	02.11.2009 
72.
5034 | 	25.09.2008 
73.
5034 | 	25.09.2008 
74.
5034 | 	25.09.2008 
75.
5034 | 	25.09.2008 
76.
5034 | 	25.09.2008 
77.
5037 | 	02.09.2009 
78.
5037 | 	02.09.2009 
79.
5037 | 	02.09.2009 
80.
5037 | 	02.09.2009 
81.
5037 | 	02.09.2009 
82.
5041 | 	29.06.2009 
83.
5041 | 	29.06.2009 
84.
5041 | 	29.06.2009 
85.
5041 | 	29.06.2009 
86.
5041 | 	29.06.2009 
87.
  
88.
 
89.
> 
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
Bitte warten ..
Mitglied: Biber
25.01.2010 um 09:56 Uhr
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
01.
SELECT qEinzel.G, qEinzel.b, qEinzel.xy  
02.
FROM quelltabelle as qEinzel,  
03.
( Select G,  max(B) AS Bmax, max(xy) as XYmax FROM Quelltabelle GROUP BY G) as qKumu 
04.
Where qEinzel.G = qkumu.G 
05.
AND qEinzel.b =qKumu.bmax 
06.
AND qEinzel.XY=qKumu.XYmax
...ein akzeptableres Ergebnis?

Grüße
Biber
Bitte warten ..
Mitglied: hallodri69
01.02.2010 um 07:58 Uhr
ja

danke nochmal an alle.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Datenbanken
gelöst Row Number bei einer Abfrage sinnvoll einsetzen (1)

Frage von Aximand zum Thema Datenbanken ...

Batch & Shell
gelöst Powershell - Dateien aus verschiedenen Arrays - Attribute vergleichen (5)

Frage von Giffas zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...