create table absence ( empId int not null, absenceDate datetime not null, reason nvarchar(100) not null, severityPoints int
) go ----2.如果员工缺勤连续超过一天,就视为长病假,这时,第二天,第三天及以后的天数都不会统计该员工的缺勤计分 ----这些天也不算为缺勤。 ---这个怎么实现呢? ---最简单的方法,就是允许severityPoint允许为0 ---更新 ‘长病假",同时缺勤计分为0 update absence set severityPoints=0,reason="长病假" where exists (select * from absence as a where absence.empId=a.empId and absence.absenceDate=dateadd(d,-1,a.absenceDate)
)
--1.如果员工在一年内的缺勤计分达到50,就会可以解雇该员工。 select empid,SUM(severityPoints) as totalPoints from absence group by empId
--删除 --delete from employee where empid =(select a.empid from absence where a.empid=employee.empid group by a.empid having sum(severityPoints)>=50) -- ---上面的语句中是否存在Bug呢? ---有。 ---1.子查询没有按钮要求检查员工的缺勤计分在一年内是否达到或超过50,它需要在where子名中进行额外的日期范围检查 --修改之后的删除 --delete from employee where empid =(select a.empid from absence where a.empid=employee.empid --and absenceDate between dateadd(d,-365,getdate()) and getdate() --group by a.empid having sum(severityPoints)>=50) -- --2关于在删除了员工之后,却没有删除此员工的缺勤记录,需要显式删除或隐式删除,隐式删除可以添加级联删除。
---假设:如果在缺勤期间,员工不会调换部门,则可以使用以下语句来提高性能 update absence set severityPoints=0,reason="长病假" where exists (select * from absence a where a.empId=absence.empId and dateadd(d,-1,absence.absenceDate)=a.absencedate )
select empId,SUM(severitypoints) as score from absence a ,calendar b where b.calendarDate=a.absenceDate and a.absenceDate between DATEADD(d,-365,getdate()) and GETDATE() group by empId having SUM(a.severitypoints)>=50