帮忙分析下sql语句 本帖最后由 qq646748739 于 2009-12-19 01:08:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 恩!是整型! 请教下:-overtime_total 表示什么意思? 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 应该就可以了吧 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 看看这样行吗?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 ; 开始我也是也样写的!但是报:leavetime_total标识符无效而我下面把leavetime_total当作了别名了! 和上面写的一样!还是不对!计算出来的是:-leavetime_total 即:sum(-leavetime_total); 楼主把6楼的group by 去掉,然后sum(overtime_total) 后面加个over(partition by empno) ,看看行不行啊? 不是吧?我在第一个union all那里改了个别名,都改成overtime_total了,A处是正数下面的函数 B 前面加了个减号(-),sum起来还不是A-B的? 我用的是Oracle中经典的两点交叉算法: 1.请假(或加班)开始时间 <= 统计结束时间 2.请假(或加班)结束时间 >= 统计开始时间 只要同时满足1.2,就能保证加班和请假的记录在统计的时间内! 但是在统计时间变化的同时,加班和请假的记录的相关字段值都在变化! 修改之后,和sum(overtime_total)+group by 一样,居然求和结果均为:0 我也感到很纳闷了! Oracle Data Integrator 问题? 从数据库中取得Timestamp类型 ,set 到 Bean中报错。 OracleManagementServer服务不能启动??? 读取重复记录?(有点复杂) 买一个oracle 要多少钱 求高手推荐ORACLE开发及维护的好书。 广州有oracle高手吗,给钱.修复oracle 本人面试的一道题目,请大家积极参加 急急急急急急急急急急急急急急急急急急急急急急ORACLE-PACKAGE问题 升为一颗星,散分!!! oracle过滤重复数据,并排序问题。 存储过程中的统计问题,在线等!
请教下:-overtime_total 表示什么意思?
这里不明吧?
就是说 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 应该就可以了吧
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
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
;
开始我也是也样写的!
但是报:leavetime_total标识符无效
而我下面把leavetime_total当作了别名了!
计算出来的是:-leavetime_total 即:sum(-leavetime_total);
然后sum(overtime_total) 后面加个over(partition by empno) ,看看行不行啊?
不是吧?我在第一个union all那里改了个别名,都改成overtime_total了,A处是正数
下面的函数 B 前面加了个减号(-),sum起来还不是A-B的?
我用的是Oracle中经典的两点交叉算法:
1.请假(或加班)开始时间 <= 统计结束时间
2.请假(或加班)结束时间 >= 统计开始时间 只要同时满足1.2,就能保证加班和请假的记录在统计的时间内!
但是在统计时间变化的同时,加班和请假的记录的相关字段值都在变化!
修改之后,和sum(overtime_total)+group by 一样,
居然求和结果均为:0 我也感到很纳闷了!