如何每天返回下一个30天组的数据集

时间:2017-05-17 06:44:40

标签: sql oracle calendar date-arithmetic

我有一个像这样的查询返回今天的员工薪水

select salary
from   employee_salary
where  sysdate between start_date and end_date.

我想生成一个查询,该查询在接下来的30天内每天返回员工组的工资(基于每天的工资显示 - 薪水来自工作小时数的列)。真正的问题是如何增加< / p>

sysdate+1 between start_date and end_date
sysdate+2 between start_date and end_date 

在同一个查询上。所以它每天都会产生薪水总和。  所以数据集就像

date       name salary
sysdate+1  emp1 100
sysdate+1  emp2 90
sysdate+2  emp1 30
...................
sysdate+30 emp1 130

请注意sysdate + x实际上会返回一个日期。如何修改我的查询以在下一个sysdate + 30天内返回这样的数据。

1 个答案:

答案 0 :(得分:1)

您需要生成接下来30天的列表。将日历加入employee_salary表,按日期范围过滤。使用聚合语法对每天的工资进行汇总。

所以:

 with cal as (
    select sysdate+level as dt    
    from dual
    connect by level <= 30
)
select cal.dt as "date"
       , sum(es.salary) as sal_daily_total
from cal
     left outer join employee_salary es
     on es.start_date <= cal.dt
     and es.end_date >= cal.dt
group by cal.dt

显而易见的障碍是,如果employee _salary日期范围跨越,则总计将包括周末和公众假期计算的工资。如果这是一个问题,请编辑您的问题以澄清您的要求。