从范围确定病假期

时间:2017-02-21 09:56:22

标签: sql sql-server excel excel-vba vba

我有以下一组数据,表示一段时间(12个月)内的员工生病/缺勤天数,在名为Absence的表中:

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 

我想根据生病的实例更新OccasionsSick列。所以我会有以下内容:

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 

所以,前两个条目是病假的相同时期,所以我需要第一行中的1,最后一个条目是一个单独的病假,所以再次为1。

现在,为了建立一个病假期,将会提到一个包含以下内容的名册表:

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

所以27日和29日是病假,但28日是标准休息日,这很可能发生,因此连续几天不是一种选择。我需要能够找到病假,直到#34;正常"找到RosterType,然后打破生病期。然后需要根据所需的结果集分配该值。

这里更新数据的最佳方法是什么?除了确定生病期的逻辑之外,我在这方面提出了一个很大的空白。

我在Excel中使用VBA呈现此数据,因此在VBA中分配病假也比在原始数据中使用SQL更容易

1 个答案:

答案 0 :(得分:1)

请检查一下。 这假设每个名单中都有一个条目。 基本上我只是建立一个时期并计算名单中的日子。 如果它们之间有正常的天数,它将被视为一个新的时期。

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