2017-02-21 2 views
0

Ich habe die unten von Daten festgelegt, die Mitarbeiter krank/Abwesenheit Tage über einen Zeitraum (12 Monate) von Zeit darstellt, in einer Tabelle mit dem Namen Abwesenheit: aktualisierenBestimmung Kranker Perioden von Bereichen

Day   Date  DaysSick OccasionsSick Notes 
Tuesday  2016-09-27  1     Lisa A working today 
Thursday 2016-09-29  1     Lisa sick today Celeste 
Thursday 2017-01-05  1     Lisa sick today 

Ich mag die OccasionsSick-Spalte basiert auf den Fällen, in denen sie krank ist. So würde ich habe folgende:

Day   Date  DaysSick OccasionsSick Notes 
Tuesday  2016-09-27  1   1   Lisa A working today 
Thursday 2016-09-29  1      Lisa sick today Celeste 
Thursday 2017-01-05  1   1   Lisa sick today 

So ist die ersten beiden Einträge sind im gleichen Zeitraum des Krankenstand, so brauche ich ein 1 in der ersten Reihe, und der letzte Eintrag ist eine separate kranke Zeit, so ein 1 noch einmal.

Nun, um einen kranken Zeit zu etablieren würde es einen Verweis auf einen Roster Tisch die folgenden enthalten:

Date   RosterType 
2016-09-27 Sick 
2016-09-28 Day Off 
2016-09-29 Sick 
2016-09-30 Normal 

So ist der 27. und 29. waren Krankheitstage, aber der 28. war ein Standard-Tag , was ein wahrscheinliches Ereignis ist, so dass die Verwendung aufeinanderfolgender Tage keine Option ist. Ich muss in der Lage sein, kranke Tage zu suchen, bis ein "normaler" RosterType gefunden wird, das bricht dann die kranke Periode. Diese 1 muss dann entsprechend der gewünschten Ergebnismenge zugewiesen werden.

Was ist der beste Weg, um die Daten hier zu aktualisieren? Abgesehen von der Logik, eine kranke Zeit zu bestimmen, habe ich eine große Lücke gefunden.

ich diese Daten in Excel mit VBA zu präsentieren, so könnte es auch einfacher sein, die krank Perioden in VBA zuweisen, im Gegensatz zu den Rohdaten SQL

+1

Ich habe die Logik noch nicht ganz verstanden. Du schreibst 'So, die ersten zwei Einträge sind die gleiche Periode des Krankenurlaubs, also brauche ich eine 1 in der ersten Reihe, und der letzte Eintrag ist eine getrennte kranke Periode, also wieder eine 1.' Warum sind die ersten zwei Reihen verbunden? Das Datum ist anders, der Tag ist anders und die Noten sind anders. Was macht sie verwandt? – Ralph

+0

Hallo, sie sind die gleiche Zeit der Mitarbeiter krank ist. Da es sich um eine Reihe von kranken Dienstplanarten vor dem nächsten normalen Dienstplan handelt (also wenn sie wieder arbeiten). Die Daten sind unterschiedlich, da sie die verschiedenen Krankheitstage der Periode sind. – Stuart1044

+1

@ Stuart1044 Ralph's Punkt ist, dass es keinen eindeutigen Bezeichner für einen Zeitraum und keine klare Definition der Beziehung gibt. Sie können Ihre Daten ordnen und dann iterieren, indem Sie den Wert von networkdays (x, y) mit x-y vergleichen, um zusammenhängende Zeiträume ohne Wochenenden zu finden. Da Sie nicht definiert haben, was ein "normaler arbeitsfreier Tag" ist, gibt es (wahrscheinlich falsche) Annahmen in der Logik, die Menschen treffen müssen. – Zerk

Antwort

1

Bitte check this out. Dies setzt voraus, dass für jeden Tag ein Eintrag im Dienstplan vorhanden ist. Im Grunde baue ich nur eine Periode und zähle die Tage in der Liste. Wenn dazwischen normale Tage liegen, gilt dies als neuer Zeitraum.

WITH CTE AS (
    SELECT 
     [day] 
     ,[date] 
     ,LAG(date, 1) over (order by date) datebefore 
     ,[dayssick] 
    FROM [dbo].[absence] 
) 
SELECT 
    * 
    ,CASE WHEN ((SELECT COUNT(1) FROM [dbo].[rostertype] WHERE date < c.date AND date > c.datebefore AND rostertype = 'Normal') > 0 
     OR c.datebefore IS NULL) THEN 1 ELSE 0 END OccasionsSick 
FROM CTE c 
+0

Das funktioniert etwas, aber gibt mir eine 1 in jeder Zeile. Ich kann von dort fortschreiten, um die gewünschten Ergebnisse zu erhalten. – Stuart1044

+0

Bei meinem Beispiel in der Datenbank funktionierte es und die zweite Zeile hatte eine 0. Bitte lassen Sie mich wissen, wenn ich weiter helfen kann – RoundFour