Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Katastrophenkommando am März 07, 2022, 14:00:24

Titel: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: Katastrophenkommando am März 07, 2022, 14:00:24
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
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: PhilS am März 07, 2022, 14:59:27
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)
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: ebs17 am März 07, 2022, 20:25:09
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"
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: Katastrophenkommando am März 08, 2022, 01:13:46
Hallo,

vielen Dank schonmal an Euch beide!

Zitat von: ebs17 am März 07, 2022, 20:25:09
Zitat 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:

PersonIDOrganame TestdatumErgebnis
10022B17.02.2022Ja
10022B07.03.2022
10195A22.02.2022Ja
10195A04.03.2022Ja
10195A07.03.2022Ja
10277A15.02.2022Ja
10387A21.02.2022Ja
10387A01.03.2022Nein
10387A07.03.2022Ja
10750A20.02.2022Ja
10750A04.03.2022Nein

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
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: ebs17 am März 08, 2022, 08:37:14
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.
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: PhilS am März 08, 2022, 09:36:31
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.
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: Katastrophenkommando am März 08, 2022, 13:09:55
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
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: ebs17 am März 08, 2022, 15:22:10
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"
Titel: Re: Gruppierte Abfrage mit Max und Kriterium
Beitrag von: Katastrophenkommando am März 08, 2022, 18:47:03
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!