当前位置: 代码迷 >> Sql Server >> 怎么计算多条件的字段的权值和
  详细解决方案

怎么计算多条件的字段的权值和

热度:73   发布时间:2016-04-24 10:22:20.0
如何计算多条件的字段的权值和?
现业务有这样的要求:
人员排班管理中,按星期一至星期日为一周进行排班,每周正常上班天数为5.5天,每一个班次对应一个假期权值(如:全日的权值对应1,休息的权限对应0,病假的权值对应1),现在要把每个人员的每周的排班的班次权值和减去5.5,算出当周的假期,现有一个特殊要求:在排病假的班次时,如果刚好碰到周六日,病假的权值变为0,再加回0.5天,以下是之前的存储过程,求大神帮忙加一下这个特殊要求。谢谢!
注释:
oa_schearrange  排班表,一个员工每天生成一条排班记录,表中的rangeid对应班次属性
oa_schedul   班次表,schedulid对应oa_schearrange表中的rangeid,权值取自该表中的holvalue

CREATE Procedure [dbo].[P_CalcHolidayByUser] @userid int
As
Declare @WorkTime decimal(18,1);
Declare @WorkTime1 decimal(18,1);
Declare @titleid int;
declare @initial float
set @WorkTime=5.5;
set @WorkTime1=6;
select @titleid=titleid from oa_loginuser where userid=@userid;
select @initial=initial from oa_holiday where userid=@userid;
delete from oa_holiday where userid=@userid;
if(@titleid=5)
begin
insert into oa_holiday(userid,initial,holiday)select @userid,isnull(@initial,0),isnull(@initial,0)+sum(holvalue) from
(select sum(isnull(T_B.holvalue,0)+isnull(T_C.holvalue,0))-@WorkTime1 as holvalue from oa_schearrange T_A left join oa_schedul T_B on T_A.rangeid=T_B.schedulid
left join oa_schedul T_C on T_A.overtimeid=T_C.schedulid
where T_A.userid=@userid and T_A.rangedate<dateadd(day,1-(datepart(weekday,getdate())),getdate()) group by cast(year(rangedate) as varchar)+'-'+datename(week,dateadd(day,-1,rangedate))) T_Temp;
end
else
begin
insert into oa_holiday(userid,initial,holiday)select @userid,isnull(@initial,0),isnull(@initial,0)+sum(holvalue) from
(select sum(isnull(T_B.holvalue,0)+isnull(T_C.holvalue,0))-@WorkTime as holvalue from oa_schearrange T_A left join oa_schedul T_B on T_A.rangeid=T_B.schedulid
left join oa_schedul T_C on T_A.overtimeid=T_C.schedulid
where T_A.userid=@userid and T_A.rangedate<dateadd(day,1-(datepart(weekday,getdate())),getdate()) group by cast(year(rangedate) as varchar)+'-'+datename(week,dateadd(day,-1,rangedate))) T_Temp;
end

GO

------解决方案--------------------
建议在最后面加上这个算法的实现,一条update 语句应该就行了
如果刚好碰到周六日,病假的权值变为0,再加回0.5天

update T_C set T_C.holvalue=0 --再加回0.5天,不知道是哪个字段
from oa_schearrange T_A left join oa_schedul T_B on T_A.rangeid=T_B.schedulid
left join oa_schedul T_C on T_A.overtimeid=T_C.schedulid
where T_A.userid=@userid and DATENAME(weekday,T_A.rangedate)='星期六'
  相关解决方案