首先是包含日期的表格以及是否是假期。此表包含从开始时间到结束时间的所有日期:)
Table Calendar
-DMY date PK
-isHoliday bit
其次,出勤表保存了人们的出勤率。如果一个人是onleave,那么该标志设置为1.
Table Attendance
-Id int PK
-DMY date FK
-CheckIn time
-PersonId int
-onLeave bit
现在我想得到一个观点,告诉我在给定的时间间隔内缺席或休假的人。问题是,缺席的考勤表中没有条目。
区间20150822至20150829的样本结果
DMY | personId | onLeave
-------------------------------------
20150823 | 1 | 0
20150823 | 2 | 1
20150825 | 3 | 0
20150826 | 2 | 0
20150827 | 8 | 0
20150827 | 5 | 0
20150827 | 1 | 1
20150829 | 3 | 1
目前:使用onLeave = 0
输入考勤表离开:在出勤表中输入onLeave = 1
缺席:当天没有参加Calendar.isHoliday = 0的参加
我希望创建一个程序,根据样本(缺席和离开)在 @startDate 提供的时间间隔内为我提供所有人的数据 @endDate 参数。
任何帮助,提示和线索都将深受赞赏。
注意:我无法修改表结构。
答案 0 :(得分:1)
所有人的列表":
人与日历之间的交叉联接每人产生一天,如果没有出席该人缺席,则左连接会使出席人数减少
SELECT p.PersonID ,
a.*,
absent = CASE WHEN a.onLeave IS NULL OR onLeave = 1 THEN 1 ELSE 0 END
FROM Calendar c
CROSS JOIN Persons p
LEFT JOIN Attendance a ON c.DMY = a.DMY AND a.PersonId = p.PersonId
WHERE C.DMY > @startDate AND C.DMY < endDate AND c.isHoliday <> 1