SQL für Dummies: Tipp für Abfrage-Syntax gesucht

Beiträge
7
Hallo zusammen,

habe eine kleine SQL-DB mit vereinbarten Terminen:

Timestamp | Name | TerminDatum | Terminflag

Terminflag wird entsprechend gesetzt V(erpasst) oder E(rschienen)

Ich möchte ermitteln wer seinen Termin in einem bestimmten Zeitraum verpasst hat, bisher wurde das täglich per Zettel gemacht.

SELECT * From [dbo].[Termin] WHERE [Terminflag] = 'V'

liefert mir alle, die einen Termin verpasst haben (vom Zeitraum mal abgesehen), aber das ist leider nur die halbe Miete. Falls nämlich z.B jemand den Termin verpasst hat (Flag = V) und dann aber ne Woche später einen neuen Termin ausmacht und dann auch erscheint, gibt es einen neuen Eintrag mit Flag=E. Derjenige sollte also nicht in der Liste auftauchen.

Ich brauche also eine Abfrage, die mir alle Einträge mit Flag=V liefert, zu denen es aber keinen späteren Eintrag mit Flag=E gibt. Und da bin ich schlicht und einfach zu doof!

Hoffe ich habe das Problem nicht zu kompliziert beschrieben.
 
Werbung:
Wie weiß ich denn ob der später Termin zu dem früheren gehört, kann das nicht einfach nur ein neuer Termin sein?
Code:
SELECT t.Name FROM ( SELECT Name,max(TerminDatum) AS Datum FROM Termin GROUP BY Name ) t INNER JOIN Termin ON t.Name = Termin.Name AND t.Datum = Termin.TerminDatum AND Termin.Terminflag = 'V'
Es gibt aber vermutlich noch ein dutzend anderer Wege...
 
Hallo ukulele,
vielen Dank für die Abfrage, kann leider erst später probieren.

Zu deiner Frage:
Die Termine müssen nicht "zusammengehören", ich muss nur wissen, ob im Zeitraum x ein Termin verpasst wurde und später kein neuer eingehalten wurde also FLAG=E.

Beispiel:
|Timestamp | Mustermann Max | 01.04.2016| V|
|Timestamp | Hanswurst Karl | 03.04.2016| V|
|Timestamp | Mustermann Max | 03.04.2016| E|

Wenn ich hier über den April suche, darf nur Hanswurst erscheinen, Mustermann hat zwar auch verpasst, kam aber dafür 2 tage später dann doch noch.

Viele Grüße und nochmals Danke!!
 
Das geht wie oben beschrieben zzgl. Zeitraum. Aber ich würde es anders machen weil ein fester Zeitraum ist ja doof, was wenn der Termin am ersten des Folgemonats dann doch statt gefunden hat?
Code:
SELECT DISTINCT t.Name FROM Termin t WHERE t.Terminflag = 'V' AND NOT EXISTS ( SELECT 1 FROM Termin WHERE Termin.Name = t.Name AND Termin.Terminflag = 'E' AND Termin.TerminDatum BETWEEN t.TerminDatum AND dateadd(dd,30,t.TerminDatum) )
Hier würden alle Personen ausgegeben werden die einen verpassten Termin haben und keinen erfolgreichen Termin innerhalb 30 Tage danach wahr genommen haben.
 
Werbung:
Zurück
Oben