Hallo,
so langsam komme ich mit meiner Datenbank so einigermaßen klar, jetzt habe ich allerdings ein Problem mit einer Abfrage. Ich bin mir sicher das geht irgendwie, ich bin aber wohl mit meinen sehr beschränkten SQL Kenntnissen zu doof dafür.
Ich habe Mitarbeiter, die zu verschiedenen Unterweisungen müssen. Dabei kann jeder der Mitarbeiter jede Unterweisung natürlich mehrfach mitgemacht haben, da man die alle in einem bestimmten Turnus machen muss.
In meiner Abfrage möchte ich mir jetzt anzeigen lassen, welche Mitarbeiter vom heutigen Datum ausgehend als nächstes zu einer Unterweisung müssen. Das habe ich mit dem folgenden Code auch hinbekommen:
SELECT m.txtAbteilung, m.txtKürzel, m.txtName, m.txtVorname, mu.txtKürzelUW, Max(mu.datErfolgteUW) AS MaxErfolgteUW, Max(mu.datNächsteUW) AS MaxNächsteUW
FROM Mitarbeiter AS m INNER JOIN MitarbeiterUnterweisungen AS mu ON m.txtKürzel = mu.txtKürzel
WHERE (((m.datAustritt) Is Null))
GROUP BY m.txtAbteilung, m.txtKürzel, m.txtName, m.txtVorname, mu.txtKürzelUW
HAVING (((Max(mu.datNächsteUW))>Date()))
ORDER BY m.txtAbteilung, m.txtName;
Jetzt habe ich allerdings das Problem dass auch die Möglichkeit besteht, dass ein Mitarbeiter früher zur Unterweisung geht als er müsste, und ich somit zwei nächste Unterweisungstermine bekomme, die nach dem aktuellen Datum liegen.
Beispiel: Mitarbeiter XYZ war 2 mal bei der Unterweisung A. Meine Tabelle sieht also beispielsweise so aus:
txtKürzel | txtKürzelUW | datErfolgteUW | datNächsteUW
XYZ | A |12.12.2017 | 12.12.2018
XYZ | A | 14.02.2018 | 14.02.2019
Das Datum in der 1. Zeile, der 12.12.2018 ist zwar immer noch in der Zukunft, aber nicht mehr das Datum, das mich für den nächsten Termin noch interessieren würde.
Ich müsste also etwas in die Abfrage einbauen, das auch das max des datErfolgteUW mit einbezieht. Ich bekomme das leider nicht hin, da ich nicht weiß wie und wo ich das einbauen müsste.
Kann mir vielleicht jemand weiterhelfen?
Kurzempfehlung: Entferne das Feld datNächsteUW als Tabellenfeld und berechne es in einer Abfrage. So kannst Du Dich bei der Max-Ermittlung auf datErfolgteUW beschränken.
Hallo,
vielen Dank für deinen Vorschlag. Leider ist das für mich keine Möglichkeit, da sich das Feld nicht berechnen lässt. Es gibt keinen festen Turnus, sondern das wird je nach Mitarbeiter individuell festgelegt. Dass das in meinem Beispiel immer ein Jahr war war nur meiner Faulheit geschuldet.
Ja, der Vorschlag war auch nur ein Beispiel, ausreichend für die Vorgabe. Weiterdenken ist aber nicht verboten.
Folgetermin = DateAdd(IntervallArt, Intervallperiode, LetzterTermin)Wenn man nun die Informationen IntervallArt und Intervallperiode gemeinsam mit einen Schlüssel (Maßnahme-ID, Mitarbeiter-ID) in einer zusätzlichen Tabelle ablegt, kann man dann sehr vielschichtig variieren.
ZitatEs gibt keinen festen Turnus, sondern das wird je nach Mitarbeiter individuell festgelegt.
Die Entscheidung darüber (über den Turnus) fällt erst während der Abfrageausführung oder vielleicht schon vor Start der Abfrage?
Daten des ersten Datensatzes dürften bei der Aggregierung erst gar nicht erscheinen, da beide Max-Werte dem 2. Datensatz entstammen. Ich stelle deshalb Deiner Aussage in Zweifel - siehe dbfiddle (http://dbfiddle.uk/?rdbms=sqlite_3.8&fiddle=ecd67c8b485aa5035f98e39348b596b6).