我有以下一组数据,表示一段时间(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更容易
答案 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