Вы обнаружите больной до или после отпуска, возможно, на выходных - PullRequest
0 голосов
/ 29 мая 2020

Это то, в чем я пытаюсь разобраться, и любое направление будет оценено.

  • Сотрудник 6 взял выходной в пятницу 16.08.2019, но позвонил в больницу Четверг, 15 августа 2019 г.

  • Сотрудник 10 взял отпуск с понедельника по четверг 12 августа 2019 года, 15 августа 2019 года, затем позвонил в больницу 16 августа 2019 года

  • Сотрудник 14 взял отпуск с понедельника по пятницу, 05.08.2019, 09.08.2019, а затем позвонил в больницу в следующий понедельник, 12.08.2019.

  • Сотрудник 23 позвонил по болезни в пятницу 02.08.2019 перед началом отпуска 08.05.2019 - 08.09.2019.

У меня есть код, который ищет шаблон, в этом случае я ищу 3 дня болезни подряд, чтобы убедиться, что это не случай FMLA, но я не могу разобрать logi c, чтобы проверить SK накануне или после рабочего дня.

DECLARE @var_StartDate DATETIME = '10/28/2018' -- Set the start date
DECLARE @var_EndDate DATETIME = '10/26/2019';  --Set the end date

--:OUT"C:\Data\3_consecutive_Sick_Days.csv"

SELECT 
        EMPLOYEEID
       ,CONVERT(VARCHAR(10),MIN(ABSENCEDATE),101) AS Absence_Start
       ,LEFT(DATENAME(DW,MIN(ABSENCEDATE)),3) AS Start_DOW
       ,CONVERT(VARCHAR(10),MAX(ABSENCEDATE),101) AS Absence_End
       ,LEFT(DATENAME(DW,MAX(ABSENCEDATE)),3) AS End_DOW
       ,COUNT(EMPLOYEEID) AS Count
       ,PAYCODENAME

FROM (SELECT A.EMPLOYEEID, A.ABSENCEDATE,A.PAYCODENAME,SUM(COL) OVER(PARTITION BY EMPLOYEEID, PAYCODENAME ORDER BY ABSENCEDATE) AS GRP
      FROM (SELECT A.*,
            CASE WHEN DATEDIFF(DAY,LAG(ABSENCEDATE) OVER(PARTITION BY EMPLOYEEID, PAYCODENAME ORDER BY ABSENCEDATE),ABSENCEDATE)=1 
                --OR (DATEPART(WEEKDAY,[ABSENCEDATE])=2 AND DATEPART(WEEKDAY,LAG([ABSENCEDATE]) OVER(PARTITION BY EMPLOYEEID,PAYCODENAME ORDER BY ABSENCEDATE))=6)
            THEN 0 ELSE 1 END AS COL
            FROM VP_ABSENCE A
                      WHERE   ABSENCEDATE BETWEEN @var_StartDate AND @var_EndDate
                              AND PAYCODENAME IN ('SK')
                              AND A.TIMEINSECONDS > 0

                ) A ) A

GROUP BY EMPLOYEEID, PAYCODENAME, GRP
HAVING DATEDIFF(DAY,MIN(ABSENCEDATE), MAX(ABSENCEDATE)) >2
ORDER BY EMPLOYEEID, CONVERT(VARCHAR(10),MIN(ABSENCEDATE),101)

Я бы хотел, чтобы выходной результат был:

6, SK, 08/15/2019, PT, 08/16/2019, NULL
10, SK, 08/16/2019, PT, 08/12/2019, 08/15/2019
14, SK, 08/12/2019, PT, 08/05/2019, 08/09/2019
23, SK, 08/02/2019, PT, 08/05/2019, 08/09/2019

Данные, указанные ниже ....

Emp        Date            DOW    Code    Hours     Wages
6          08/15/2019      Thu    SK      8.000000  0.000000
6          08/16/2019      Fri    PT      8.000000  0.000000
10         08/12/2019      Mon    PT      8.000000  0.000000
10         08/13/2019      Tue    PT      8.000000  0.000000
10         08/14/2019      Wed    PT      8.000000  0.000000
10         08/15/2019      Thu    PT      8.000000  0.000000
10         08/16/2019      Fri    SK      8.000000  0.000000
13         08/08/2019      Thu    PT      1.000000  0.000000
13         08/09/2019      Fri    PT      2.000000  0.000000
14         08/05/2019      Mon    PT      8.000000  0.000000
14         08/06/2019      Tue    PT      8.000000  0.000000
14         08/07/2019      Wed    PT      8.000000  0.000000
14         08/08/2019      Thu    PT      8.000000  0.000000
14         08/09/2019      Fri    PT      8.000000  0.000000
14         08/12/2019      Mon    SK      8.000000  0.000000
16         08/12/2019      Mon    PT      8.000000  0.000000
16         09/06/2019      Fri    PT      3.000000  0.000000
16         09/13/2019      Fri    PT      2.000000  0.000000
21         08/05/2019      Mon    PT      8.000000  0.000000
21         08/09/2019      Fri    PT      8.000000  0.000000
21         08/16/2019      Fri    PT      8.000000  0.000000
21         09/03/2019      Tue    PT      8.000000  0.000000
21         09/04/2019      Wed    PT      8.000000  0.000000
21         09/05/2019      Thu    PT      8.000000  0.000000
23         08/02/2019      Fri    SK      8.000000  0.000000
23         08/05/2019      Mon    PT      8.000000  0.000000
23         08/06/2019      Tue    PT      8.000000  0.000000
23         08/07/2019      Wed    PT      8.000000  0.000000
23         08/08/2019      Thu    PT      8.000000  0.000000
23         08/09/2019      Fri    PT      8.000000  0.000000

1 Ответ

0 голосов
/ 29 мая 2020

Лучшее решение - создать календарную таблицу (измерение даты), содержащую все даты и столбцы, такие как dayOfTheWeek, isHoliday и c. Это значительно упростит задачу.

Затем вы можете использовать эту таблицу, чтобы присоединиться к вашей таблице отсутствия. например,

WITH CTE_abs
as (

    SELECT dat.theDate,allEmployees.emp,isnull(ab.code,'WD') as code,row_number() over (partition by allEmployees.emp order by dat.theDate) as seq
    FROM dbo.alldates dat
    CROSS JOIN  (   SELECT DISTINCT emp
                    FROM dbo.absences
                ) allEmployees
    LEFT JOIN dbo.absences ab
        on ab.emp = allEmployees.emp
        and ab.absenceDate = dat.theDate
    WHERE dat.theDate between '2019-08-01' and '2019-08-31'
    and dat.TheDayName not in ('sunday','saturday')

)
SELECT *
from CTE_abs abs1
join CTE_abs abs2
    on abs1.emp = abs2.emp
    and abs1.seq = abs2.seq-1
WHERE abs1.code <> abs2.code
and abs1.code in ('SK','PT')
and abs2.code in ( 'SK','PT' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...