Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage

Begonnen von ricog, Januar 14, 2011, 23:40:52

⏪ vorheriges - nächstes ⏩

ricog

Hallo,

folgendes Problem beschäftigt mich.
Es handelt sich um Personen die sich regelmäßig einer ärztlichen Untersuchung unterziehen müssen um ihre Tauglichkeit nachzuweisen.
d.h. es gibt die Felder Name, letzte Untersuchng, nächste Untersuchung in der Tabelle.
Um auch alle Untersuchungen aller Personen in  der Vergangenheit auflisten zu können, muß also jede Untersuchung einen Datensatz bekommen.
Jetzt habe ich ein Formular erstellt, in dem ich die Daten eingeben kann und das mir gleichzeitig zeigt ob die Untersuchung noch aktuell ist.
Das habe ich über ne Abfrage problemlos hingekriegt.

Jetzt brauche ich ein weiteres Formular bzw. einen Bericht mit den gleichen Feldern, das mir in einer Liste anzeigt, alle letzten Untersuchungen (aber wirklich nur die letzte) aller Personen um zu wissen wann sie das nächste mal zur Untersuchung müssen, bzw. im zu wissen ob die Gültigkeit der Untersuchung schon abgelaufen ist oder nicht. (ähnlich wie beim TÜV am Auto) - davon brauche ich die Abfrage

Vielleicht kann mir ja jemand helfen, würde mich freuen...

Ciao Rico

Hondo

Hallo,
folgende Abfrage listet alle auf deren Untersuchung abgelaufen ist:
SELECT ID, Name, lastUntersuchung, nextUntersuchung
FROM Tabelle1
WHERE nextUntersuchung<Now()

Du solltest deine Felder ohne Umlaute und ohne Sonderzeichen wie Leerzeichen o.ä. benennen.
Außerdem sollte deine Tabelle eine ID-Spalte haben mit FeldTyp Autowert der Primärschlüssel ist.

Gruß Andreas

ricog

Hallo Andreas,

ich brauche aber von jedem die letzte Untersuchung, egal ob abgelaufen oder nicht in einer Liste...

oma

Hallo Rico,

möglich wäre:

SELECT Nachname, Vorname Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle
GROUP BY Nachname, Vorname



Gruß Oma
nichts ist fertig!

database

Hallo,

SELECT Nachname, Vorname, Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle

... sonst Fehler...  ::)


ricog

mmmhh,
das funktioniert nicht mit "letzter Wert", aber dafür mit "max" auf das Datumsfeld "letze Untersuchung"...
nun tut sich ein neues Problem auf, wenn ich weitere Felder (wie z.B. nächste Untersuchung, tauglich, Bemerkungen) dazu nehme, bringt mir das wieder mehrere Datensätze pro Person...

Was muss ich da machen???...

oma

Hallo,

wenn du weitere Felder zufügst, werden diese gruppiert was du sicher nicht möchtest.
Du musst also bei den weiteren Feldern überlegen,  was du aus der Gruppe (Person) haben willst: Letzter Wert, Max...

Gruß Oma

@Peter: dir entgeht auch nichts 8)
nichts ist fertig!

ricog

also es sieht so aus, als würde das funktionieren...

Was mich nur stutzig macht, wenn ich das richtig verstehe, dann werden so keine zusammenhängenden eingegebenen Datensätze abgefragt, sondern Felder aus verschiedenen Datensätzen zu einem neuen Datenatz zusammengefügt?!..

Stimmt das?

Wenn ja, dann kann es doch sein, das dieser Datensatz im Zusammenhang falsch ist, oder nicht?

oma

Hallo,

es werdens schon zusammenhängende Datensätze abgefragt, nur im Ergebnis stehen Werte in einer Gruppe aus verschiedenen DS

wenn z.B. nach einen Namen gruppiert wird, kannst du aus allen Datensätzen der Gruppe (nämlich der Person) verschiedene Werte herauslesen wie zb. LetzterWert: Max, Min usw.

Die Werte "gehören" dann immer zur Person, sind aber aus verschiedene DS ausgelesen.

Hoffe, dass das so verständlich ist.

Gruß Oma
nichts ist fertig!

ricog

das hab ich verstanden.

Gibt es denn keine Möglichkeit einen kompletten DS (oder augewählte Felder aus "einem" Datensatz) so wiederzugeben wie ich es brauche?!..  Denn so könnten die Daten doch völlig falsch zusammengefasst werden.

Ciao Rico

oma

Hallo,

ZitatDenn so könnten die Daten doch völlig falsch zusammengefasst werden.

Nein, sie sind nicht niemals falsch zusammengefasst; Zu einer Gruppe kannst du verschiedene Werte auswählen, die sind dann immer "richtig"!! Allerdings kann es sein, dass du andere Werte wie ausgewählt, benötigst.

Dann ist aber das Ergebnis der Abfrage nicht falsch, sondern entspricht evt. nicht deinen Wünschen.

Sage doch einmal, welche Werte du aus einer Tabelle dargestellt haben möchtest??


Gruß Oma
nichts ist fertig!

ricog

Also es gibt viele Personen und verschiedene Untersuchungen (z.B. U1, U2, U3, U4, U5, usw.)
manche Personen müssen eine untersuchung jährlich machen, manche alle 2..., es gibt also kein Muster.

Ich brauche:

Name, Vorname, Untersuchung, letzte Untersuchung, nächste Untersuchung, Tauglichkeit, Bemerkungen, Aktualität.

Name u. Vorname sind in einer Tabelle abgelegt.
Untersuchung, letzte Untersuchung, nächste Untersuchung, Tauglichkeit, Bemerkungen ebenfalls in einer Tabelle (wird dann über PersonalNr verknüpft)
Aktualität wird in der Abfrage ermittelt, wo die Daten dann zusammengesetzt werden. Aktuell ist eine Untersuchung, wenn das aktuelle Datum zwischen letzter und nächster Untersuchung liegt.(das hilft mir bei der Filterung im Eingabeformular, da alle Untersuchungen neu eingegeben werden müssen, und nicht überschriebenwerden.)

So und ich brauche also eine Liste für U1 auf der jede Person mit den Daten der letzten Untersuchung aufgeführt ist, um zu erkennen, ist die Untersuchung abgelaufen oder nicht. (z.B. kann man dort auch erkennen, das ich die betreffende Person wieder zur neuen Untersuchung rechtzeitig anmelden muß.)
Genauso für U2, U3.....usw...

Ich hoffe es ist einigermaßen verständlich.

Ciao Rico

database

#12
Hallo,

na dann win neuer Versuch:


SELECT tblPersonen.Vorname, tblPersonen.Nachname, tblUntersuchungen.naechsteU, tblUntersuchungen.letzteU,
tblUntersuchungen.Tauglichkeit, tblUntersuchungen.Bemerkung, IIf([naechsteU]<Now(),"abgelaufen","aktuell") AS Aktualitaet
FROM tblPersonen INNER JOIN tblUntersuchungen ON tblPersonen.PersonalID = tblUntersuchungen.Personal_FK
WHERE tblUntersuchungen.ID In (SELECT Last(tblUntersuchungen.ID) AS LetzterWertvonID
FROM tblUntersuchungen
GROUP BY tblUntersuchungen.Untersuchung, tblUntersuchungen.Personal_FK
HAVING tblUntersuchungen.Untersuchung="U1";);


....liefert das in der Abbildung im Anhang befindliche Beispielergebnis.
In der Herkunftstabelle sind mehere U1-Daten mit aufsteigendem Datum ab 01.01.2009 enthalten.

Zum Ablauf der Abfrage:

Es werden in der SubQuery die IDs der Datensätze ermittelt, welche das nach Personalnummer gruppierte höchste Untersuchungsdatum (im gegenständlichen Fall für U1) - enthalten.
Diese ID-Liste wird dann in der Query als Auswahlkriterium auf die ID-Spalte angewendet. In der Query werden die gewünschten Felder angezeigt.

HTH

p.s. Ergebnisse für U2 bis Un erhältst du indemdu im HAVING-Filter die Untersuchung änderst.



[Anhang gelöscht durch Administrator]

ricog

hab ich jetzt eingegeben und angepasst.

es gibt ein problem mit personal_FK  - was soll das sein?

database

Hi,

mit Personal_FK habe ich den Fremdschlüssel (FK = ForeignKey) zur tblPersonal in meinem Testbeispiel bezeichnet - wird in deiner Tabelle vllt. gleich heißen wie der Primärschlüssel der Tabelle Personal.
Zitat(wird dann über PersonalNr verknüpft)