左连接表空值替换为右表列

时间:2017-11-18 06:30:48

标签: sql oracle join

我需要在给定的日期范围内完成员工完成的任务(这里我使用的是1月1日1月31日至2017年1月31日)

This is a table where every employee daily completed number of task recorded

我有主表emp_task(右连接表),如下图所示

使用下面的查询创建日期范围表dat_calender(左连接表),如图所示 This is temporary table used to create date range

我使用以下查询

加入上表
select nam_emp,dat_day,sum(num_task) from dat_calender
       left join emp_task
       on dat_txn=dat_day
group by dat_day,nam_emp
order by dat_day
;

我得到的结果如下所示

This a result came after joining

但是在dat_calender中没有日期的情况下,它会打印空值 但是,即使员工没有完成任何任务(当天缺席/离开),我希望员工的姓名在该日期具有0值 每个员工的开始日期必须是emp_task表中的日期,并且应该在范围表中。

例如

根据上表,迈克已于2017年1月25日工作,那么他的开始日期仅为25日至1月,剩余的6天将为零。 就像明智的曼努埃尔凝视日期是29日至1月,然后2天的剩余将是零。 对于在给定日期范围内可用的所有员工,同样如此。

2 个答案:

答案 0 :(得分:0)

对于汇总列,您应该能够nvl(sum(num_task),0)

但是,您不清楚要显示的员工姓名。如果您想为每个日期显示每位员工的记录,那么您可以执行类似

的操作
with emps as (select distinct nam_emp from emp_task
              inner join dat_calendar on dat_txn=dat_day)
select e.nam_emp, c.dat_day, nvl(sum(et.num_task),0) tasks
from dat_calender c
cross join emps e
left join emp_task et on et.dat_txn = c.dat_day and et.nam_emp = e.nam_emp
group by c.dat_day, e.nam_emp
order by c.dat_day ; 

答案 1 :(得分:0)

使用exists子句创建最小日期并使用以上组加入。