Announcement

Collapse
No announcement yet.

Abfrage Datum

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

  • Abfrage Datum

    Hallo Leute,

    ich habe ein Problem.

    Und zwar hab ich zwei Tabellen (Person, Lehrgänge). Diese sind über eine Tabelle "Nimmt_Teil" miteinander verknüpft.

    Mein Ziel ist nun, dass ich alle Personen rausfiltere, deren Lehrgänge 2 Jahre zurückliegen (ausgehend vom aktuellen Jahr)

    Das ist mein bisheriges Resultat:

    SELECT Person.person_id, Person.hfnr, Person.mitgliedsnr, Person.anrede, Person.vname, Person.name AS Person_name, Lehrgang.lehrgang_id, Lehrgang.lehrgang_art_id, Lehrgangsart.name AS Lehrgangsart_name, Lehrgang.lehrgang_beginn, Lehrgang.lehrgang_ende

    FROM Person, Lehrgangsart, Lehrgang, Nimmt_Teil

    WHERE Lehrgang.lehrgang_id=Nimmt_Teil.lehrgang_id AND Lehrgangsart.lehrgang_art_id=Lehrgang.lehrgang_art _id AND Person.person_id=Nimmt_Teil.person_id

    AND (((Year(Date())-
    (SELECT max(year([Lehrgang.lehrgang_beginn])) FROM Lehrgang INNER JOIN Nimmt_Teil ON Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id WHERE Nimmt_Teil.person_id=Person.person_id)))=2);

    In der WHERE-Bedingung will ich vom aktuellen Jahr das Jahr aus dem SubSelect abziehen (also das jahr, in der die jeweilige Person ihren letzten Lehrgang absolviert hat) und diesen Wert mit 2 vergleichen.

    Sollte eigentlich von der Logik her funktionieren. Problem ist nur, dass Access mir alle Personen ausspukt, die es gibt.

    Könnt ihr mir da evtl helfen?

    Danke schon einmal.

    Gruß Sign

  • #2
    Muss mich verbessern:

    will alle Personen, deren letzter Lehrgang 2 Jahre zurückliegt. Sorry

    Comment


    • #3
      Bitte verbessere dich gleich noch einmal und formatiere den Code:

      [highlight=sql]SELECT ...[/highlight]

      Rücke die Zeilen sinnvoll ein und mache zusätzliche Zeilenumbrüche, damit die Zeilen nicht zu breit sind, und kontrolliere das Ergebnis vor dem Speichern durch die Vorschau. Gehe dazu auf deinen ersten Beitrag mit "Editieren" und dann auf "Erweitert".

      So wie es jetzt aussieht, kann man das kaum lesen, und ich will mich damit noch nicht befassen. Jürgen

      Comment


      • #4
        [highlight=sql]SELECT Person.person_id, Person.hfnr, Person.mitgliedsnr,
        Person.anrede, Person.vname, Person.name AS Person_name, Lehrgang.lehrgang_id, Lehrgang.lehrgang_art_id, Lehrgangsart.name AS Lehrgangsart_name, Lehrgang.lehrgang_beginn, Lehrgang.lehrgang_ende

        FROM Person, Lehrgangsart, Lehrgang, Nimmt_Teil

        WHERE Lehrgang.lehrgang_id=Nimmt_Teil.lehrgang_id AND
        Lehrgangsart.lehrgang_art_id=Lehrgang.lehrgang_art _id AND Person.person_id=Nimmt_Teil.person_id
        AND (((Year(Date())-
        (SELECT max(year([Lehrgang.lehrgang_beginn])) FROM Lehrgang INNER JOIN Nimmt_Teil ON Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id WHERE Nimmt_Teil.person_id=Person.person_id)))=2);[/highlight]

        ok sorry zweiter versuch

        Comment


        • #5
          [highlight=sql]SELECT Person.person_id, Person.hfnr, Person.mitgliedsnr,
          Person.anrede, Person.vname, Person.name AS Person_name, Lehrgang.lehrgang_id, Lehrgang.lehrgang_art_id, Lehrgangsart.name AS Lehrgangsart_name, Lehrgang.lehrgang_beginn, Lehrgang.lehrgang_ende

          FROM Person, Lehrgangsart, Lehrgang, Nimmt_Teil

          WHERE Lehrgang.lehrgang_id=Nimmt_Teil.lehrgang_id AND Lehrgangsart.lehrgang_art_id=Lehrgang.lehrgang_art _id AND Person.person_id=Nimmt_Teil.person_id

          AND (((Year(Date())-
          (SELECT max(year([Lehrgang.lehrgang_beginn])) FROM Lehrgang INNER JOIN Nimmt_Teil ON Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id WHERE Nimmt_Teil.person_id=Person.person_id)))=2);
          [/highlight]

          ich kriegs nicht besser hin sorry

          Comment


          • #6
            Hi,

            ich würde es glaube ich so machen:

            (Vorausgesetzt, dass ich da jetzt keinen Fehler eingebaut habe)

            [highlight=sql]
            SELECT Person.person_id, Person.hfnr, Person.mitgliedsnr, Person.anrede, Person.vname, Person.name AS Person_name, Lehrgang.lehrgang_id, Lehrgang.lehrgang_art_id, Lehrgangsart.name AS Lehrgangsart_name, Lehrgang.lehrgang_beginn, Lehrgang.lehrgang_ende
            FROM Person
            INNER JOIN Lehrgang
            INNER JOIN Lehrgangsart ON Lehrgangsart.lehrgang_art_id = Lehrgang.lehrgang_art_id
            WHERE
            (Person.person_id, Lehrgang.lehrgang_beginn) IN (
            SELECT Nimmt_Teil.person_id, max(year([Lehrgang.lehrgang_beginn]))
            FROM Lehrgang
            INNER JOIN Nimmt_Teil ON Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id
            GROUP BY Nimmt_Teil.person_id
            HAVING max(year([Lehrgang.lehrgang_beginn])) = 2
            );
            [/highlight]
            "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

            Viele Grüße Novi

            Comment


            • #7
              Warum nicht einfach:
              Code:
              WHERE year([Lehrgang.lehrgang_beginn]) <= (YEAR(NOW)-2)
              Dann kann auf vermutlich auf die Unterabfrage mit GROUP BY und HAVING verzichtet werden; das ist nämlich deutlich langsamer.

              Jürgen

              PS. Einrückungen und Zeilenumbrüche schreibt man einfach in den Quelltext.
              [highlight=sql]SELECT Person.person_id,
              Person.hfnr,
              Person.mitgliedsnr /* usw. */
              FROM Person
              INNER JOIN Lehrgang /* usw. */[/highlight]
              Dass das so schwer ist... Außerdem habe ich doch darauf hingewiesen, dass Beiträge mit "Editieren" korrigiert werden können.

              Comment


              • #8
                Originally posted by Jürgen Thomas View Post
                Warum nicht einfach:
                Code:
                WHERE year([Lehrgang.lehrgang_beginn]) <= (YEAR(NOW)-2)
                Dann kann auf vermutlich auf die Unterabfrage mit GROUP BY und HAVING verzichtet werden; das ist nämlich deutlich langsamer.

                Jürgen
                Das dürfte nicht gehen, weil er nur den aktuellsten Lehrgang pro Person haben will, falls dieser älter als 2 Jahre sein sollte, und nicht alle die älter als 2 Jahre sind. Oder sehe ich das falsch?


                Originally posted by sign View Post
                (...) also das jahr, in der die jeweilige Person ihren letzten Lehrgang absolviert hat (...)
                "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

                Viele Grüße Novi

                Comment


                • #9
                  Originally posted by Novi View Post
                  Das dürfte nicht gehen, weil er nur den aktuellsten Lehrgang pro Person haben will
                  Du könntest recht haben, aber ich sagte ja schon:
                  So wie es jetzt aussieht, kann man das kaum lesen, und ich will mich damit noch nicht befassen.
                  Deshalb habe ich weiterhin nicht genauer nachgedacht, sondern mich nur über MAX und HAVING gewundert. (Es könnte passen, aber wenn es zu vermeiden ist, wäre das besser.) Jürgen

                  Comment


                  • #10
                    ja nicht ganz. ich will alle Personen, deren letzter Lehrgang 2 Jahre zurück liegt.
                    Trotzdem Danke für eure Hilfe.


                    von daher funktioniert des nicht ganz. Meine Logik war eben, dass ich vom aktuellen jahr das jahr des letzten Lehrgangs von jeder Person abzieh. Und wenn die Differenz 2 ist, dann soll er die Person und alles andere, was ich in meinem ersten SELECT angeb, ausgeben.

                    Noch ne Info: Ich programmier in Microsoft Access.

                    P.S. Ach und sorry wenn ich des mit dem Formatieren nicht hinbekommen hab. Aber ich hab mich vorhin erst hier angemeldet und da war nicht alles gleich klar hier (Bitte dies zu berücksichtige). Glaub da kann man schon mal kleine Fehler verzeihen

                    Gruß Sign

                    Comment


                    • #11
                      Originally posted by sign View Post
                      Noch ne Info: Ich programmier in Microsoft Access.
                      Dann hätte dir auch auffallen können, dass es ein Unterforum für Access gibt. Diese Information wäre von Anfang an sehr hilfreich gewesen, weil jeder SQL-Dialekt anders ist und Access keine richtige SQL-Datenbank ist und deshalb nicht alle Antworten passen.

                      P.S. Ach und sorry wenn ich des mit dem Formatieren nicht hinbekommen hab. Aber ich hab mich vorhin erst hier angemeldet und da war nicht alles gleich klar hier (Bitte dies zu berücksichtige).
                      Sicher; auch dass du meine Hinweise auf "Editieren" und "Vorschau" nicht umsetzen kannst, ist völlig verständlich. Ich bitte aber auch um Verständnis, dass ich mich bei solch schlecht formatiertem Code nicht sehr anstrenge. Jürgen

                      Comment


                      • #12
                        alles klar.

                        Sorry tut mir leid.

                        Comment


                        • #13
                          Problem mit Datum

                          Hallo Leute,

                          ich habe ein Problem.

                          Und zwar hab ich zwei Tabellen (Person, Lehrgänge). Diese sind über eine Tabelle "Nimmt_Teil" miteinander verknüpft.

                          Mein Ziel ist nun, dass ich alle Personen rausfiltere, deren letzter Lehrgang 2 Jahre zurückliegt (ausgehend vom aktuellen Jahr)

                          Das ist mein bisheriges Resultat:

                          [highlight=sql]
                          SELECT Person.person_id,
                          Person.hfnr,
                          Person.mitgliedsnr,
                          Person.anrede,
                          Person.vname,
                          Person.name AS Person_name,
                          Lehrgang.lehrgang_id,
                          Lehrgang.lehrgang_art_id,
                          Lehrgangsart.name AS Lehrgangsart_name,
                          Lehrgang.lehrgang_beginn,
                          Lehrgang.lehrgang_ende
                          FROM Person,
                          Lehrgangsart,
                          Lehrgang,
                          Nimmt_Teil
                          WHERE Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id
                          AND Lehrgangsart.lehrgang_art_id=Lehrgang.lehrgang_art _id
                          AND Person.person_id=Nimmt_Teil.person_id
                          AND (((Year(Date())-(
                          SELECT max(year([Lehrgang.lehrgang_beginn]))
                          FROM Lehrgang
                          INNER JOIN Nimmt_Teil ON Lehrgang.lehrgang_id = Nimmt_Teil.lehrgang_id
                          WHERE Nimmt_Teil.person_id = Person.person_id)))=2);
                          [/highlight]

                          In der WHERE-Bedingung will ich vom aktuellen Jahr das Jahr aus dem SubSelect abziehen (also das jahr, in der die jeweilige Person ihren letzten Lehrgang absolviert hat) und diesen Wert mit 2 vergleichen.

                          Sollte eigentlich von der Logik her funktionieren. Problem ist nur, dass Access mir alle Personen ausspukt, die es gibt.

                          Könnt ihr mir da evtl helfen?

                          Danke schon einmal.

                          Gruß Sign
                          Zuletzt editiert von Falk Prüfer; 25.02.2010, 13:00. Reason: Doppelposting hier eingefügt und Formatierung verbessert

                          Comment


                          • #14
                            Hi, bin mit der Syntax von Access nicht vollends vertraut, aber das wäre mein (ungetester) Vorschlag:

                            Code:
                            SELECT Person.person_id,
                                   Person.hfnr,
                                   Person.mitgliedsnr,
                                   Person.anrede,
                                   Person.vname,
                                   Person.name AS Person_name,
                                   Lehrgang.lehrgang_id,
                                   Lehrgang.lehrgang_art_id,
                                   Lehrgangsart.name AS Lehrgangsart_name,
                                   Lehrgang.lehrgang_beginn,
                                   Lehrgang.lehrgang_ende
                            FROM Person,
                                 Lehrgang,
                                 Lehrgangsart
                            WHERE
                                 Lehrgangsart.lehrgang_art_id=Lehrgang.lehrgang_art_id AND
                                 Lehrgang.lehrgang_id=
                                 (SELECT TOP 1 l.lehrgang_id FROM Lehrgang l,  Nimmt_Teil nt
                                      WHERE l.lehrgang_id = nt.lehrgang_id AND
                                                  Person.person_id=nt.person_id
                                      ORDER BY l.lehrgang_beginn DESC) AND
                                 (Year(Date()) - Year(Lehrgang.lehrgang_beginn)) = 2
                            Wie gesagt, bin kein Access-Kenner, aber unter MSSQL oder MySQL (mit LIMIT statt TOP) könnte das funzen...

                            Comment

                            Working...
                            X