Announcement

Collapse
No announcement yet.

SQL Abfrage mit Between

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Abfrage mit Between

    Hallo,
    ich habe ein etwas verzwicktes Problem:

    Bericht
    -PersonID
    -Datum

    Anwesenheit
    -PersonID
    -DatumVon
    -DatumBis

    Es wird für jede Person einer oder mehrere Zeiträume erfasst. Bsp.:
    Anwesenheit:
    PersonID DatumVon DatumBis
    1 01.01.2012 01.03.2012
    2 01.01.2012 01.05.2012
    1 01.06.2012 01.08.2012
    Bericht:
    PersonID Datum
    1 01.07.2012
    2 01.03.2012
    Und das Abfrageergebnis, das ich gerne hätte ist:
    PersonID DatumVon DatumBis Bericht Datum
    1 01.01.2012 01.03.2012
    2 01.01.2012 01.05.2012 01.03.2012
    1 01.06.2012 01.08.2012 01.07.2012
    Also, er soll den Bericht zu dem Eintrag anzeigen, in dessen Bereich er erstellt wurde. Wurde in disem Bereich kein bericht erstellt, soll er [NULL] ausgeben.

    Ich habe es mit folgendem versucht:
    [Highlight=sql]SELECT PersonID, DatumVon, DatumBis
    FROM Anwesenheit LEFT JOIN Bericht ON Anwesenheit.PersonID=Bericht.PersonID
    WHERE Bericht.Datum BETWEEN Anwesenheit.DatumVon AND Anwesenheit.DatumBis[/highlight]

    Das Problem ist, dass ich dann das bekomme:
    PersonID DatumVon DatumBis Bericht Datum
    1 01.01.2012 01.03.2012 01.07.2012
    2 01.01.2012 01.05.2012 01.03.2012
    1 01.06.2012 01.08.2012 01.07.2012
    Was mache ich hier falsch?

    Ich sag schonmal Danke für die Tips!
    Zuletzt editiert von Chriss; 12.11.2015, 20:04.

  • #2
    Ich würde die Zeile gar nicht erwarten. Die 2.te Bedingung hast du ja per WHERE dran gehängt ist somit nicht Teil des Outer Join. In deiner erwarteten Zeile wäre Datum NULL und NULL Between irgendwas ist immer false.
    Somit ist deine Abfrage logisch kein Outer Join mehr sondern nur noch ein normaler Join und du solltest die Zeile effektiv weggefiltert haben. Korrekt wäre die mit AND dran zuhängen anstatt WHERE damit die Bedingung Teil des Outer Joins wird.

    [Highlight=SQL]SELECT Anwesenheit.PersonID, Anwesenheit.DatumVon, Anwesenheit.DatumBis, Bericht.Datum
    FROM Anwesenheit
    LEFT JOIN Bericht ON ( Anwesenheit.PersonID = Bericht.PersonID
    AND Bericht.Datum BETWEEN Anwesenheit.DatumVon AND Anwesenheit.DatumBis)[/Highlight]

    Was soll passieren wenn mehr als 1 Bericht in dem Anwesenheit Zeitraum auftreten?
    Zuletzt editiert von Ralf Jansen; 12.11.2015, 18:57.

    Comment


    • #3
      Hallo Ralf,

      Originally posted by Ralf Jansen View Post
      Was soll passieren wenn mehr als 1 Bericht in dem Anwesenheit Zeitraum auftreten?
      dann sollte der Zeitraum auch 2x erscheinen, 1x mit jedem Berichtdatum.

      Danke!
      Zuletzt editiert von Chriss; 12.11.2015, 20:16.

      Comment


      • #4
        Hallo Ralf,

        es gibt ein Update:
        Originally posted by Ralf Jansen View Post
        Was soll passieren wenn mehr als 1 Bericht in dem Anwesenheit Zeitraum auftreten?
        Dann soll der jüngste Eintrag ausgewählt werden.
        Geht das?

        eine Idee:
        [Highlight=sql]SELECT Anwesenheit.PersonID, Anwesenheit.DatumVon, Anwesenheit.DatumBis, Bericht.Datum
        FROM Anwesenheit
        LEFT JOIN (Select PersonID, max(Datum) From Bericht Group By PersonID) ON ( Anwesenheit.PersonID = Bericht.PersonID
        AND Bericht.Datum BETWEEN Anwesenheit.DatumVon AND Anwesenheit.DatumBis)[/highlight]
        Aber, dann gibt er mir ja immer nur den neuesten Bericht pro Person aus, und nicht den neuesten, der zu der jeweiligen Anwesenheit passt.
        Zuletzt editiert von Chriss; 18.11.2015, 19:59.

        Comment


        • #5
          Dann würde ich keinen Join mehr benutzen sondern einen Subselect in der Select-Klausel der zu jeder Zeile in Anwesenheit dann max. eine Zeile aus Bericht liefert.

          [HIGHLIGHT=SQL]SELECT Anwesenheit.PersonID, Anwesenheit.DatumVon, Anwesenheit.DatumBis,
          (SELECT Top 1 Datum FROM Bericht
          WHERE Anwesenheit.PersonID = Bericht.PersonID
          AND Bericht.Datum BETWEEN Anwesenheit.DatumVon AND Anwesenheit.DatumBis
          ORDER BY Datum) as Datum
          FROM Anwesenheit [/HIGHLIGHT]

          Test it.

          Comment


          • #6
            Funktioniert, wunderbar!

            Vielen Dank!

            Comment

            Working...
            X