现有表两张 请假表leave  加班表jiaban 
leave 
leaveid  leaveuser  leavetype  leavehours 
100001      tom          补休      1.5 
100002      red          年假      3 
100003      tom          年假        5 
100004      tom          补休      6.5 
jiaban 
  jbid    jbuser    jbhours 
  200001    tom        2 
  200002    red        2 
  200003    tom        3.5 
  200004    tom        4 要求。 将请假单中的统计时间  与  加班单中的统计时间抵消,只剩下下面的  
例如100004  tom 请假类型为补休,请假统计为6.5小时  那么抵消加班单200001 和200003即jb_reset=0。200004中的jb_reset 还剩3 可以用作下次比较   修改加班单
jiaban 
  jbid    jbuser    jbhours  jb_reset 
  200001    tom        2        0      2 <6.5 置0 
  200002    red        2        2 
  200003    tom        3.5      0      3.5 <(6.5-2)  所以置0  
  200004    tom        4        3      4>(6.5-2-3.5)  所以为(4-(6.5-2-3.5)_=3 

然后下次补休就比较200004 中的3,而不是4! 

解决方案 »

  1.   


    select
        a.jbid,
        a.jbuser,
        a.jbhours,
        case when a.jb_reset<isnull(b.leavehours,0) then 0 else a.jb_reset-isnull(b.leavehours,0) end as jb_reset
    from (
    select
        x.jbid,
        x.jbuser,
        x.jbhours,
        (select sum(jbhours) from jiaban where jbuser=x.jbuser and jbid<=x.jbid) as jb_reset 
    from 
        jiaban x
    ) as a
    left join
        (select leaveuser,sum(leavehours) as  leavehours  from leave where leavetype='补休' group by leaveuser) as b
    on a.jbuser=b.leaveuser
    order by a.jbid
      

  2.   

    搂主的举例为什么没计算
    100001      tom          补休      1.5 
    数据?
      

  3.   

    现在只要jb_reset结果。例如
    create proc Pr_reset
    @hours float 
    as