如何根据SQL中的开始日期和结束日期在年-月级别上聚合度量值?
我有一个SQL查询,它包含三列,如下所示如何根据SQL中的开始日期和结束日期在年-月级别上聚合度量值?,sql,oracle,datetime,count,recursive-query,Sql,Oracle,Datetime,Count,Recursive Query,我有一个SQL查询,它包含三列,如下所示 employee_id start_date end_date hours 123 09-01-2019 09-02-2019 8 123 09-28-2019 10-01-2019 32 我想重写查询,而不是细化查询,我只想知道员工在年-月级别上的SUMHR,如下所示: employee_id Year_Month hours 123 201909
employee_id start_date end_date hours
123 09-01-2019 09-02-2019 8
123 09-28-2019 10-01-2019 32
我想重写查询,而不是细化查询,我只想知道员工在年-月级别上的SUMHR,如下所示:
employee_id Year_Month hours
123 201909 32
123 201910 8
员工9月份有4天,因此4*8=32,10月份有一天,因此10月份有8小时。我的问题是相邻月份之间何时有开始和结束日期交叉。我不知道如何编写查询以获得所需的输出,我非常感谢您在这方面提供的任何帮助。使用递归查询来生成每月的天数序列,然后按月汇总并计数可能更简单:
with
data as (< your existing query here >),
cte (employee_id, dt, max_dt) as (
select employee_id, start_date, end_date from data
union all
select employee_id, dt + 1, max_dt from cte where dt + 1 < max_dt
)
select employee_id, to_char(dt, 'yyyymm') year_months, count(*) * 8 hours
from mytable
group by employee_id, to_char(dt, 'yyyymm')
正如您在问题中所解释的那样,假设每天工作8小时。请您提供原始数据的样本。在示例中,我给出了8小时,但可能会有所不同。因此,理想情况下,它是两个日期之间的天数乘以小时数列。在这种情况下,如果我用*小时数代替*8数,这行得通吗?@PrashanthChitrambalam:也许,你是说*小时数。但在这种情况下,您也需要cte返回列小时数。