计算两天之间的休假净额权利差异

时间:2014-08-03 18:24:28

标签: sql oracle oracle-sqldeveloper plsqldeveloper

有两个问题我正在获取一个给出今天缺席余额的查询 另一个会给昨天的缺席余额

今天的净权利:

query 1 :


select e.emp_no,
a.absence_code,
a.net_entitlement
from emp_details e,
absence_tab_history a
where a.person_id=e.person_id
and a.history_date=trunc(sysdate);

昨天的净权利:

query 2 :

select e.emp_no,
a.absence_code,
a.net_entitlement
from emp_details e,
absence_tab_history a
where a.person_id=e.person_id
and a.history_date=trunc(sysdate)-1;

现在查询1将获取今日净权利的列,例如

emp no. Absence code        net entitlement

1        Sick Leave             9
2        Privilege Leave        5
3        Sick Leave             5

现在,查询2将获取昨天的员工净收入列

emp no. Absence code        net entitlement

1        Sick Leave             10
2        Privilege Leave        5
3        Sick Leave             6

这意味着没有。 1和2的净权利已经改变,他们两人每人休假1次。现在我想创建一个捕获相同的查询。只有emp 1和2 也就是说,如果净权利已更改,则仅显示已更改的行。 减号不适用于此并且花费太多时间来执行。请帮助

2 个答案:

答案 0 :(得分:0)

    with present_day 
as
(
select 1 as emp_id,'Sick Leave' as code , 9 as net_entitlement from dual
union
select 2 as emp_id,'Privilege Leave' as code , 5 as net_entitlement from dual
union
select 3 as emp_id,'Sick Leave' as code , 5 as net_entitlement from dual
),
yester_day
as
(
select 1 as emp_id,'Sick Leave' as code , 10 as net_entitlement from dual
union
select 2 as emp_id,'Privilege Leave' as code , 5 as net_entitlement from dual
union
select 3 as emp_id,'Sick Leave' as code , 6 as net_entitlement from dual
)

select a.emp_id,a.code,a.net_entitlement,decode(a.net_entitlement-b.net_entitlement,0,'UNCHG','CHNG')
from present_day a,yester_day b
where a.emp_id=b.emp_id and a.code=b.code
and decode(a.net_entitlement-b.net_entitlement,0,'UNCHG','CHNG')='CHNG'

尝试以上代码并告诉我

答案 1 :(得分:0)

您需要将数据放在表格中以进行比较。这是一种方法:

select e.emp_no, coalesce(a.absence_code, ath.absence_code) as absence_code,
       a.net_entitlement, ath.net_entitlement
from emp_details e left join
     absence_tab_history ath
     on ath.person_id = e.person_id and
        ath.history_date = trunc(sysdate) - 1 left join
     absence_tab a
     on a.person_id = e.person_id
where a.person_id is null or
      ath.person_id is null or
      ath.net_entitlement <> a.net_entitlement;

where条款中的前两个条件适用于出现的新员工以及离职的前员工。

相关问题