我有一个像这样的查询返回今天的员工薪水
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天内返回这样的数据。
答案 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
日期范围跨越,则总计将包括周末和公众假期计算的工资。如果这是一个问题,请编辑您的问题以澄清您的要求。