Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Verknüpfungsproblem

Begonnen von hajott, Oktober 28, 2019, 12:07:24

⏪ vorheriges - nächstes ⏩

hajott

Hallo Wissende,

ich habe ein Problem, bei dem ich nicht weiterkomme. Vom Gefühl her könnte man das mit "endlos viel" Schachtelungen hinbekommen, aber unübersichtlich und wahrscheinlich auch nicht sehr performant. Meine Frage ist, ob die gewünschte Abfrage auch noch leichter zu selektieren geht.

Ich habe zwei Tabellen:

tblMitarbeiter mit den Feldern
- ID (Autowert)
- Personalnummer
- Name (es gibt noch ein paar mehr Personaldaten, das ist an der Stelle aber nicht relevant)

tblAbwesenheiten mit den Feldern
- ID (Autowert)
- Personalnummer
- Abwesenheitskennziffer (Grund einer Abwesenheit, als Long codiert)
- Von (Date)
- Bis (Date)
Hier werden die geplanten und ungeplanten Krankheiten, Urlaube etc. verzeichnet - auch mehrere pro Personalnummer möglich

Ziel ist eine Abfrage, in der jeder Mitarbeiter nur 1x vorkommt. Für den Fall, dass er abwesend ist, soll in den entsprechenden Feldern der Grund sowie die Daten von-bis drinstehen.

Mein erster Ansatz war nun, eine Unterabfrage zu bilden, die aus den Abwesenheiten erstmal die rausfiltert, die nicht den heutigen Tag betreffen: SELECT * FROM tblAbwesenheiten WHERE Start <= Date() AND Ende >= Date(). Dies habe ich dann mit einem LeftJoin mit der Mitarbeitertabelle verknüpft, und das Ergebnis hat sich sehen lassen ... bis zu dem Tag, als durch einen Erfassungsfehler für einen Mitarbeiter mehrere Erfassungen vorhanden waren, die für heute galten. Die obige Praxis führte dazu, dass der Mitarbeiter auch 2x in der Zieltabelle auftauchte.

Mir ist es (Anfänger) auch gelungen, noch eine Tabelle dazwischenzuschalten, mit der ich das obige noch "einrahme" und dann die kleinste Kennzahl und die Personalnummer selektiere und das Ganze nach der Personalnummer gruppiere. Dann hatte ich tatsächlich nur den Eintrag mit der kleinsten Kennzahl in der Zieltabelle.

Allerdings wird diese Anwendung in Zukunft häufig verwendet und ich muss auch immer auf den "DAU" Rücksicht nehmen ;-)) Zum Beispiel kann es sein, dass zwei verschiedene Erfasser die gleiche Krankheit erfassen, dann hilft mir die Selektion der kleinsten Kennzahl auch nichts mehr. Deswegen will ich das von vorn herein abfangen mit folgenden Regeln:
1. Kriterium: kleinste Abwesenheitskennzahl
2. Kriterium: größtes Endedatum und wenn das immer noch gleich ist dann
3. Kriterium: kleinste ID.

Ich hatte auch schon SELECT MIN(Kennzahl), MIN(ID), MAX(Ende) zu stehen, bis mir klar wurde, dass das ja nicht alles auf den gleichen Datensatz referenziert. Auch hatte ich überlegt, nach diesen Kriterien zu sortieren und dann mit TOP 1 den obersten zu nehmen, aber dann kommt der Datensatz des ersten Mitarbeiters. Das muss ja auf alle angewendet werden.

Ich hoffe, ihr könnt mir folgen und meiner "Gehirnverknotung" etwas auf die Sprünge helfen ;-))

Vielen Dank im voraus

Hans-Jürgen

ebs17

#1
ZitatIch habe zwei Tabellen
Eigentlich schon drei: Eine m:n-Beziehung zwischen Mitarbeiter und Abwesenheitskategorie. Zum eigentlichen Rechnen würde man sich aber auf die Verknüpfungstabelle tblAbwesenheiten beschränken.

ZitatZum Beispiel kann es sein, dass zwei verschiedene Erfasser die gleiche Krankheit erfassen
Über einen eindeutigen Mehrfelderindex (MA-ID, Kategorie-ID, Startdatum) könnte man das bereits auf Tabellenebene verhindern.

Zitataus den Abwesenheiten erstmal die rausfiltert, die nicht den heutigen Tag betreffen
Die Betrachtung betrifft immer nur den heutigen Tag  und nicht etwa mehrere Tage?

Ansonsten nach Deiner Anforderung:
SELECT
   A.*
FROM
   tblAbwesenheiten AS A
WHERE
   A.ID IN
      (
         SELECT TOP 1
            X.ID
         FROM
            tblAbwesenheiten AS X
         WHERE
            Date() BETWEEN X.Von
               AND
            X.Bis
               AND
            X.Personalnummer = A.Personalnummer
         ORDER BY
            X.Abwesenheitskennziffer,
            X.Bis DESC,
            X.ID
      )


Diese Abfrage kannst Du nun als Ersatz für die ganze Tabelle tblAnwesenheiten mit den weiteren Tabellen je Bedarf verknüpfen.
Mit freundlichem Glück Auf!

Eberhard

hajott

Hallo Eberhard,

wow, das klingt gut, das werde ich heute abend mal so ausprobieren.

Zu deinen Fragen: Ja, es wird nur der heutige Tag betrachtet. Und es ist gewünscht, dass alle Erfassungen erstmal möglich sind, auch wenn sich später zeigt, dass was doppelt ist. Hier muss dann die Datenbank richtig reagieren, aber mit deiner Abfrage bin ich da gut präpariert!

Dim n as Long
for n = 1 to 1000
msgbox "Vielen Dank, Eberhard"
next


Viele Grüße
Hans-Jürgen