我需要在给定的日期范围内完成员工完成的任务(这里我使用的是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天的剩余将是零。 对于在给定日期范围内可用的所有员工,同样如此。
答案 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子句创建最小日期并使用以上组加入。