Hallo,
ich bin neu hier und hoffe ich bin mit der Frage im richtigen Forum gelandet.
Ich habe eine Access-DB, in der ich eine Abfrage mit folgendem SQL-Befehl ausführen möchte:
SELECT Person_tbl.PersonID, Organisation_tbl.Organame, Max(Test_tbl.Testdatum) AS MaxvonTestdatum, Test_tbl.Ergebnis
FROM (Person_tbl INNER JOIN Organisation_tbl ON Person_tbl.OrgaID = Organisation_tbl.OrgaID) INNER JOIN Test_tbl ON Person_tbl.PersonID = Test_tbl.PersonID
GROUP BY Person_tbl.PersonID, Organisation_tbl.name, Test_tbl.Ergebnis
HAVING (((Test_tbl.Ergebnis)="Ja"));
Den Code habe ich nicht selbst erstellt, sondern aus der SQL-Ansicht kopiert, nachdem ich die Abfrage im Entwurfsmodus erstellt habe.
Was ich möchte ist, dass sie mir nur die Werte ausspuckt, die im jüngsten Wert einer Person in Test_tbl.Testdatum in Test_tbl.Ergebnis "Ja" stehen haben. So spuckt sie natürlich den jüngsten Test_tbl.Testdatum-Wert aus, der "Ja" in Test_tbl.Ergebnis stehen hat, auch wenn es noch jüngere Testdaten mit anderen Ergebnissen gibt.
Ich komme einfach nicht drauf, wie die Abfrage strukturiert sein muss, dass sie tut was ich will. Ich hoffe, ich habe halbwegs klar gemacht was das Problem ist.
Beste Grüße
Alex
Schau mal, ob dir der folgende Text weiterhilft: Darstellung von Daten einer 1:N-Beziehung (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=abfrage-1-zu-n-aggregatfunktion-letzter-datensatz)
ZitatDen Code habe ich nicht selbst erstellt
Wer in der Entwurfsansicht herumklickt, ist trotzdem schuld am Ergebnis.
ZitatWas ich möchte ist, dass sie mir nur die Werte ausspuckt, die im jüngsten Wert einer Person in Test_tbl.Testdatum in Test_tbl.Ergebnis "Ja" stehen haben
Grund genug, sich auf Test_tbl zu beschränken.
SELECT
E.*
FROM
Test_tbl AS E
INNER JOIN
(
SELECT
PersonID,
MAX(Testdatum) AS MaxDatum
FROM
Test_tbl
GROUP BY
PersonID
) AS D
ON E.PersonID = D.PersonID
AND
E.Testdatum = D.MaxDatum
WHERE
E.Ergebnis = "Ja"
Hallo,
vielen Dank schonmal an Euch beide!
Zitat von: ebs17 am März 07, 2022, 20:25:09Zitat von: undefinedDen Code habe ich nicht selbst erstellt
Wer in der Entwurfsansicht herumklickt, ist trotzdem schuld am Ergebnis.
Safe! ;D
Eure Vorschläge gehen in die richtige Richtung, aaaber:
In Phils Text geht es ja immer um das maximale Datum, ich möchte aber das maximale Datum herausfinden, in dem ein anderes Feld einen bestimmten Wert aufweist. Gelernt habe ich trotzdem was dabei 8)
Bei Eberhards Code werden mir nur die Datensätze angezeigt. die einen Datensatz in Test_tbl haben. Und ich brauche die OrgaID, weil ich danach später weiterfiltern muss. Die steht wiederum über Person_tbl mit Test_tbl in Beziehung. Oder sollte ich die OrgaID in einer weiteren Abfrage, die auf dieser aufsetzt dazu nehmen?
Ich habe mich aber auch richtig schlecht ausgedrückt sehe ich gerade. Ich mach mal ein Beispiel, vielleicht wird dann klarer, was ich hier gerade fasel:
| PersonID | Organame | Testdatum | Ergebnis |
| 10022 | B | 17.02.2022 | Ja |
| 10022 | B | 07.03.2022 | |
| 10195 | A | 22.02.2022 | Ja |
| 10195 | A | 04.03.2022 | Ja |
| 10195 | A | 07.03.2022 | Ja |
| 10277 | A | 15.02.2022 | Ja |
| 10387 | A | 21.02.2022 | Ja |
| 10387 | A | 01.03.2022 | Nein |
| 10387 | A | 07.03.2022 | Ja |
| 10750 | A | 20.02.2022 | Ja |
| 10750 | A | 04.03.2022 | Nein |
Angezeigt werden sollen die letzten Datensätze, die "Ja" im Ergebnis stehen haben, wenn nicht danach ein Datensatz mit "Nein" vorhanden ist (Also auch, wenn es zwar einen "späteren" Datensatz gibt, dieser im Ergebnis aber Null ist:
PersonID Organame Testdatum Ergebnis
10022 B 17.02.2022 Ja
10195 A 07.03.2022 Ja
10277 A 15.02.2022 Ja
10387 A 07.03.2022 Ja
Viele Grüße
ZitatBei Eberhards Code werden mir nur die Datensätze angezeigt. die einen Datensatz in Test_tbl haben
Na immerhin.
In Deinem Beispiel verschwindet 10750, obwohl es nach bisher bekannten Regeln beibehalten werden müsste.
Also Klarheit sieht anders aus.
Über zu verwendende Beziehungen würde ich erst nachdenken, wenn ich ein Beziehungsbild sehe, so zur Aufhebung der Ausdenkblockade.
Zitatich möchte aber das maximale Datum herausfinden, in dem ein anderes Feld einen bestimmten Wert aufweist
Grundlagen - SQL ist leicht (11) - Reihenfolge der Abfrageabarbeitung (https://www.ms-office-forum.net/forum/showthread.php?t=353639)
=> Filtern und Gruppieren/Aggregieren in einem Zug
=> danach restliche Felder durch Verknüpfung mit der Tabelle bereitstellen.
Zitat von: Katastrophenkommando am März 08, 2022, 01:13:46In Phils Text geht es ja immer um das maximale Datum, ich möchte aber das maximale Datum herausfinden, in dem ein anderes Feld einen bestimmten Wert aufweist. Gelernt habe ich trotzdem was dabei (https://www.access-o-mania.de/forum/Smileys/fugue/cool.png)
Wenn ich deine Anforderungen richtig verstehe, ist der letzte Schritt doch trivial. Du hast als (bisheriges) Ergebnis den jeweils neusten Datensatz pro Person. Dieses Zwischenergebnis filterst du jetzt mit
Ergebnis="Ja". - Fertig! - Oder?
PS:
Zitat von: Katastrophenkommando am März 08, 2022, 01:13:46(Also auch, wenn es zwar einen "späteren" Datensatz gibt, dieser im Ergebnis aber Null ist:
Um das zu berücksichtigen, kannst du direkt die Datensätze mit NULL im ersten Schritt ausschließen.
Ich habe mal eine anonymisierte DB angehängt.
Ich versuchs nochmal anders zu erklären:
Es sollen die Datensätze der Einzelpersonen angezeigt werden, die als Ergebnis mal ein "Ja" hatten und nicht später noch ein "Nein". Also max. ein Datensatz je Person.
Bsp.1 (aus der DB):
15657 20.02.2022 "Ja"
15657 04.03.2022 "Nein"
--> soll nicht angezeigt werden, weil das jüngste Ergebnis "Nein" ist
15669 23.02.2022 "Nein"
15669 28.02.2022 "Nein"
--> soll nicht angezeigt werden, weil niemals "Ja"
15670 21.02.2022 "Nein"
15670 01.03.2022 "Ja"
15670 07.03.2022
--> soll mit dem Datensatz vom 01.03.2022 angezeigt werden, weil das das jüngste Datum mit Ergebnis "Ja" ist und kein "Nein" mehr folgt
15667 21.02.2022 "Nein"
15667 28.02.2022 "Ja"
15667 04.03.2022 "Nein"
15667 07.03.2022 "Ja"
--> soll mit dem Datensatz vom 07.03.2022 angezeigt werden, weil das das jüngste Datum mit Ergebnis "Ja" ist und kein "Nein" mehr folgt
ZitatIn Deinem Beispiel verschwindet 10750, obwohl es nach bisher bekannten Regeln beibehalten werden müsste.
Habe ich jetzt deutlicher gemacht, warum der verschwindet?
ZitatWenn ich deine Anforderungen richtig verstehe, ist der letzte Schritt doch trivial. Du hast als (bisheriges) Ergebnis den jeweils neusten Datensatz pro Person. Dieses Zwischenergebnis filterst du jetzt mit Ergebnis="Ja". - Fertig! - Oder?
Das habe ich in der TestDB in der qry_maxTestDatumErgebnisNichtNull versucht. Damit spuckt er mir den Datensatz von 15657 mit Testdatum 20.02.2022 aus, obwohl ein jüngeres Testergebnis "Nein" enthält.
tut mir leid, wenn ich das zu umständlich erkläre, ich weiß nicht, wie ich das deutlicher machen könnte.
No Fronts, vielen Dank für Eure Hilfe
Jetzt bringst Du plötzlich NULL-Inhalte ins Spiel (beim nächsten Mal dann Ostereier, die zu suchen sind?).
Wenn ich die Störenfriede einfach ausfiltere, stimmt (in meiner Wahrnehmung) die von mir gezeigte Anwendungslogik nach wie vor.
SELECT
E.*
FROM
Test_tbl AS E
INNER JOIN
(
SELECT
PersonID,
MAX(Testdatum) AS MaxDatum
FROM
Test_tbl
WHERE
Ergebnis IS NOT NULL
GROUP BY
PersonID
) AS D
ON
(E.Testdatum = D.MaxDatum)
AND
(E.PersonID = D.PersonID)
WHERE
E.Ergebnis = "Ja"
ZitatJetzt bringst Du plötzlich NULL-Inhalte ins Spiel (beim nächsten Mal dann Ostereier, die zu suchen sind?).
Hab ich doch hier schon - und zugegeben, dass die erste Beschreibung dürftig war:
ZitatAngezeigt werden sollen die letzten Datensätze, die "Ja" im Ergebnis stehen haben, wenn nicht danach ein Datensatz mit "Nein" vorhanden ist (Also auch, wenn es zwar einen "späteren" Datensatz gibt, dieser im Ergebnis aber Null ist:
Wie auch immer und was auch immer ich beim ersten Versuch falsch gemacht habe - ganz viel Dank geht raus an Dich und Phil. Sie tut jetzt was sie soll, soweit ich das bisher überblicken kann!
Ich werde mich jetzt dann mal damit befassen, was genau Dein Code macht, ich will ja besser werden.
Danke!