2012-03-26 8 views
0

Verwenden von SQL 2005. Ich habe drei Tabellen: Meetings, Kontakte und Meeting_Contacts.Aktualisieren Sie Personen, die 3 aufeinanderfolgende Tage abwesend sind

Die Sitzungen Tabelle hat diese Felder: Meeting_ID, meeting_name, DATE_START, Location

Kontakte hat: contact_id, vorname, nachname, Missed_Three_Days

Meeting_Contacts: Meeting_ID, contact_id

Ich brauche das aktualisieren "Missed_Three_Days" -Feld, wenn die Person drei aufeinanderfolgende Tage verpasst hat, ausgenommen Wochenenden.

z.B. Wenn er Freitag verpasst, Montag und Dienstag die „Missed_Three_Days Feld würde am Dienstag aktualisiert.

Hier ist, wo ich so weit bin ... ich stecken auf der where-Anweisung.

update contacts set missed_three_days = 'Missed 3 Days' 
where ID not in 

(select contact_ID from MEETINGS_CONTACTS mc 
    Join meetings m 
on m.id = mc.meeting_id 
join contacts c 
on c.id = mc.contact_ID 
where m.date_start ???) 

Ich habe das Gefühl, seine offensichtliche ... aber mein Geist zeigt heute nicht in diese Richtung.

Vielen Dank für Ihre Hilfe.

+1

Was passiert, wenn an einem dieser Tage kein Meeting stattfindet? .... sollte es nicht "Missed_three_consecutive_meetings" sein? – Lamak

+0

drei Tage bis heute oder eine Lücke von drei Tagen? Falls vorhanden, gibt es einen festen Start oder beginnen Sie mit dem ersten Termin, an dem sie an einem Meeting teilgenommen haben? –

+1

Was ist mit Urlaub? – HLGEM

Antwort

0

aus der Hüfte schießen Sie eine Funktion erstellen können, die jede verpasste Sitzung für einen fehlenden zweiten Test, und dann 3. Treffen von derselben Person wie folgt aus:

CREATE FUNCTION MissedThree 
(
@pContact_ID int, 
@pKeyDate Date 
) 
RETURNS Bit 
AS 
BEGIN 

DECLARE @pReturnValue Bit = 0 /** FALSE UNTIL PROVEN OTHERWISE */ 

/** DID CONTACT MISS THIS MEETING? */ 
IF NOT Exists 
    (SELECT Meetings.Meeting_ID FROM 
    Meeting_Contacts INNER JOIN Meetings 
    ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID 
    WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pKeyDate) 
BEGIN 

    /** CHECK TO SEE IF NEXT WAS ALSO MISSED */ 

    DECLARE @pMeetingTwo Date  

    SELECT @pMeetingTwo = MAX(Date_Start) 
       FROM Meetings WHERE Date_Start > @pKeyDate; 

    IF NOT Exists 
     (SELECT Meetings.Meeting_ID FROM 
     Meeting_Contacts INNER JOIN Meetings 
     ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID 
     WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingTwo) 
    BEGIN 

     /** CHECKT TO SEE IF A THIRD CONSECUTIVE WAS MISSED */   

     DECLARE @pMeetingThree Date 

     SELECT @pMeetingThree = MAX(Date_Start) 
        FROM Meetings WHERE Date_Start > @pMeetingTwo; 

     IF NOT Exists 
       (SELECT Meetings.Meeting_ID FROM 
       Meeting_Contacts INNER JOIN Meetings 
       ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID 
       WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingThree) 
     BEGIN   
      SET @pReturnValue = 1 
     END 
    END  

END 

RETURN @pReturnValue; 

END 

Von dort müssten Sie einfach eine Abfrage auszuführen, die Täter zu identifizieren.

SELECT Contact_ID, Start_Date FROM 
    Meeting_Contacts INNER JOIN Meetings 
     ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID 
    WHERE dbo.MissedThree(Contact_ID, Start_Date) = 1 

Die hier nette Sache ist, dass es den Besprechungstisch verwendet die consecutve der Sitzungen zu bestimmen ... keinen Kalender, die Probleme wie Wochenenden, Feiertage, nicht Werktag usw.

ich haben kann Ich bin mir sicher, dass ich eine elegantere Lösung finden könnte, die effizienter ist, aber Sie müssten mich in mehr als 50 Punkten bezahlen :). Vielleicht bringt das deine kreativen Säfte zumindest zum fließen. Viele Menschen versuchen, Funktionen wie die Pest zu vermeiden.

Außerdem haben Sie die SQL-Version nicht erwähnt. Seien Sie sich daher bewusst, dass der Date-Datentyp für DateTime ausgetauscht werden muss, wenn er nicht 2008 ist.

0

Ich denke, so etwas könnte Ihre Bedürfnisse erfüllen.

--select contacts who attended less than 3 of the last 3 meetings 
    SELECT 
      contacts.contact_id, 
      COUNT(meeting_contacts.meeting_id) as AttendedMeetings 
    FROM contacts 
    LEFT OUTER JOIN 
    ( SELECT TOP 3 
       meetings.meeting_id 
      FROM meetings 
      ORDER BY meetings.date 
    ) as Last3Meetings --the last 3 meetings and their attendees, regardless of when the meeting happened 
     LEFT OUTER JOIN meeting_contacts 
      ON meetings.meeting_id = meeting_contacts.meeting_id 
      AND contacts.contact_id = meeting_contacts.contact_id 
HAVING COUNT(contacts.meeting_id) < 3 

Glückliche Kodierung!

Verwandte Themen