Announcement

Collapse
No announcement yet.

MSSQL - Letzte Zeile der Unterdatenbank

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

  • MSSQL - Letzte Zeile der Unterdatenbank

    Hallo,

    ich bin eigentlich im Sozialbereich tätig, also bitte verzeiht mir wenn ich Anfängerfragen stelle.
    Ich soll für ein psychologisches Institut einige Statistiken erstellen und mache das auf einem MSSQL-Server (2005). Wir haben eine Datenbank mit den Stammdaten von den Klienten und einige weitere Datenbanken in denen pro Klient mehrere Einträge liegen können. Zb. eine "Befunde-Datenbank" in denen alle Befunde des Klienten abgelegt werden, was meistens mehr als einer ist. Verknüpft durch die ID des Klienten.

    Ich soll jetzt eine Abfrage gestalten in der die Stammdaten ausgelesen werden und einige weitere Daten und eben das Datum des LETZTEN Befundes.

    Wie mache ich das? Mit allen möglichen JOIN-Befehlen komme ich da nicht weiter. LIMIT gibts im MSSQL nicht und mit TOP 1 erhalte ich auch irgendwie nicht das richtige Ergebnis.

    Momentan siehts so aus:

    SELECT Klient_Stammdaten.Nachname, Klient_Stammdaten.Vorname, Klient_Justiz.Auflagenende, Klient_Justiz.Beschluss, Klient_Befunde.Datum,
    Klient_Stammdaten.Gruppe
    FROM Klient_Stammdaten INNER JOIN
    Benutzer_Stammdaten ON Klient_Stammdaten.ID_Benutzer_Stammdaten = Benutzer_Stammdaten.ID INNER JOIN
    Klient_Historie ON Klient_Stammdaten.ID = Klient_Historie.ID_Klient_Stammdaten RIGHT OUTER JOIN
    Klient_Justiz ON Klient_Stammdaten.ID = Klient_Justiz.ID_Klient_Stammdaten LEFT OUTER JOIN
    Klient_Befunde ON Klient_Stammdaten.ID = Klient_Befunde.ID_Klient_Stammdaten
    WHERE (Klient_Historie.Behandlungsstatus = 'aktiv')
    ORDER BY Klient_Stammdaten.Gruppe DESC

    Momentan wird für jeden Befund eine eigene Zeile ausgegeben. Also der Klient kommt ca. 10-20 Mal vor und erst dann ist der nächste Klient. Gibt es irgendeine Möglichkeit, dass nur das letzte Befund-Datum ausgelesen wird und jeder Klient nur einmal angezeigt wird?

    Das wäre mir eine sehr große Hilfe wenn ihr euch da auskennt.

  • #2
    Vielleicht so:

    SELECT Klient_Stammdaten.Nachname, Klient_Stammdaten.Vorname, Klient_Justiz.Auflagenende, Klient_Justiz.Beschluss, Klient_Befunde.Datum,
    Klient_Stammdaten.Gruppe
    FROM Klient_Stammdaten INNER JOIN
    Benutzer_Stammdaten ON Klient_Stammdaten.ID_Benutzer_Stammdaten = Benutzer_Stammdaten.ID INNER JOIN
    Klient_Historie ON Klient_Stammdaten.ID = Klient_Historie.ID_Klient_Stammdaten RIGHT OUTER JOIN
    Klient_Justiz ON Klient_Stammdaten.ID = Klient_Justiz.ID_Klient_Stammdaten LEFT OUTER JOIN
    Klient_Befunde ON Klient_Stammdaten.ID = Klient_Befunde.ID_Klient_Stammdaten
    WHERE (Klient_Historie.Behandlungsstatus = 'aktiv') AND
    (
    Klient_Befunde.Datum = (select MAX(kb2.Datum) from Klient_Befunde kb2
    where kb2.ID_Klient_Stammdaten = Klient_Stammdaten.ID)
    )

    bye,
    Helmut
    ORDER BY Klient_Stammdaten.Gruppe DESC

    Comment


    • #3
      eher so (wg dem LEFT JOIN)
      [HIGHLIGHT="SQL"]SELECT KS.Nachname
      , KS.Vorname
      , KJ.Auflagenende
      , KJ.Beschluss
      , KBo.MaxDate
      , KS.Gruppe
      FROM Klient_Stammdaten AS KS
      JOIN Benutzer_Stammdaten AS BS ON KS.ID_Benutzer_Stammdaten = BS.ID
      JOIN Klient_Historie AS KH ON KS.ID = KH.ID_Klient_Stammdaten
      RIGHT JOIN Klient_Justiz AS KJ ON KS.ID = KJ.ID_Klient_Stammdaten
      LEFT JOIN (SELECT KBI.ID_Klient_Stammdaten
      , MAX (KBI.Datum) as MaxDate
      FROM Klient_Befunde AS KBI
      GROUP BY KBI.ID_Klient_Stammdaten
      ) AS KBo ON KBo.ID_Klient_Stammdaten = KS.ID
      WHERE KH.Behandlungsstatus = 'aktiv'
      ORDER BY KS.Gruppe DESC [/HIGHLIGHT]

      PS: Formatierung von SQL in Beiträgen

      Comment


      • #4
        Vielen Dank, ebis. Funktioniert wunderbar. Ich glaube mit der Vorlage schaffe ich es auch die beiden anderen Aufgaben (die ähnlich sind) zu lösen.

        Danke

        PS: Sorry wegen der Nicht-Formatierung. Wird das nächste Mal berücksichtigt.

        Comment

        Working...
        X