本帖最后由 qq646748739 于 2009-12-19 01:08:56 编辑

解决方案 »

  1.   

    恩!是整型!
      请教下:-overtime_total 表示什么意思?
      

  2.   

    decode(over_or_leave, 1, overtime_total, 2, -overtime_total, 0)
    这里不明吧?
    就是说 if over_or_leave = 1,取+overtime_total,对应于union all 上面那个
    if over_or_leave = 2,取-overtime_total,对应于union all 下面那个
    不等于1也不等于2,就默认输出0。
    只要把下面那个红色的leavetime_total, 改成overtime_total 应该就可以了吧
      

  3.   

    sum(overtime_total -leavetime_total)over(partition by empno) --这个是Oracle 的分析函数Oracle 分析函数
    http://blog.csdn.net/tianlesoftware/archive/2009/11/10/4795632.aspxf_cokstat_equal_time() overtime_total,   f_cokstat_record_one() leavetime_total,    --overtime_total, leavetime_total,  是2个别名,在计算时方便使用。
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716 
      

  4.   

    看看这样行吗?select empno, empname, over_startime,over_endtime,leave_startime, leave_endtime,
                  overtimenum, leavetimenum,
                  sum(overtime_total)
              from (
                    select e.empno, e.empname,
                            a.starttime over_startime,
    a.endtime over_endtime,
                            nvl(a.overtimenum, 0) overtimenum,
                            '0' leave_startime, 
    '0' leave_endtime,
                            0 leavetimenum,
                            f_cokstat_equal_time(a.starttime, a.endtime) overtime_total,                     
                      from t_employeeinfo e, t_overtime a
                      where e.empno = a.empno(+)
                    union all
                    select  e.empno, 
    e.empname,
                            '0' over_startime,
    '0' over_endtime,
                            0 overtimenum,
                            t.starttime leave_starttime, 
    t.endtime leave_endtime,
                            nvl(t.leavetimenum,0) leavetimenum,
                            -f_cokstat_record_one(i_cout_st,
                                                i_cout_et,
                                                to_date(substr(t.starttime, 1, 10), 'yyyy-mm-dd'),
                                                to_date(substr(t.endtime, 1, 10), 'yyyy-mm-dd')
                                              ) overtime_total,                                               
                      from  t_employeeinfo e, t_leave t
                      where  trunc(to_date(t.starttime,'yyyy-mm-dd hh24')) <= to_date(cok_cout_et,'yyyy-mm-dd')
                        and  trunc(to_date(t.endtime,'yyyy-mm-dd hh24'))  >= to_date(cok_cout_st,'yyyy-mm-dd')
                        and  e.empno = t.empno(+)
                    ) group by empno, empname, over_startime,over_endtime,leave_startime, leave_endtime,
                  overtimenum, leavetimenum

      

  5.   


    开始我也是也样写的!
    但是报:leavetime_total标识符无效
    而我下面把leavetime_total当作了别名了!
      

  6.   

    和上面写的一样!还是不对!
    计算出来的是:-leavetime_total 即:sum(-leavetime_total);
      

  7.   

    楼主把6楼的group by 去掉,
    然后sum(overtime_total) 后面加个over(partition by empno) ,看看行不行啊?
      

  8.   


    不是吧?我在第一个union all那里改了个别名,都改成overtime_total了,A处是正数
    下面的函数 B 前面加了个减号(-),sum起来还不是A-B的?
      

  9.   


    我用的是Oracle中经典的两点交叉算法:
     1.请假(或加班)开始时间 <= 统计结束时间
     2.请假(或加班)结束时间 >= 统计开始时间  只要同时满足1.2,就能保证加班和请假的记录在统计的时间内!
      
      但是在统计时间变化的同时,加班和请假的记录的相关字段值都在变化!
      

  10.   


    修改之后,和sum(overtime_total)+group by 一样,
    居然求和结果均为:0 我也感到很纳闷了!