Oracle SQL为每天添加所有打开的任务

时间:2015-11-20 21:21:39

标签: oracle aggregate

生命统计:     Oracle 11i     我没有权利为此事创建表或任何类型的写访问权。

目标:

我需要创建一个查询,查看最近12个月的操作并计算(每天)每天开放的操作数量。这必须是没有硬编码值的动态查询。

我定义" Open"的方式项目是指在相关日期当天或之前获得批准,并在相关日期当天或之后发布。

我尝试了什么:

我在这里发现了一个类似的问题,这个问题并没有得到很好的表达,也没有得到答案。 SQL count open tasks each day
这导致另一个问题有一些不同的想法,但不是我正在寻找的格式,因为我想最终有很多行。 SQL Count Of Open Orders Each Day Between Two Dates

以下是我迄今为止关闭的代码,但不包括我将在代码后描述的一些结果。

SELECT I.aggDate         ,
  eri.organization_id ORG,
  COUNT( (
  CASE
    WHEN OSD.date_approved < I.aggDate + interval '1' DAY
    AND osd.date_released  > I.aggDate - interval '1' DAY
    THEN 1
  END)) Items_in_DC
FROM mm_oracle_sig_dates osd ,
  ENG_REVISED_ITEMS ERI      ,
  (SELECT DISTINCT OSD.date_approved aggDate
  FROM mm_oracle_sig_dates osd
  WHERE OSD.date_approved >=TRUNC(sysdate) - interval '12' MONTH
  ) I
WHERE i.aggdate      = osd.date_approved
 and eri.change_notice    = osd.ecn_num
GROUP BY I.aggdate   ,
  eri.organization_id;

我确信问题是&#34; i.aggdate = osd.date_approved&#34;因为这会导致查询仅添加当天批准的项目,我想要计算在相关日期或之前批准的所有项目。我需要做一些明确的连接,以避免外部(我认为)加入只会造成混乱。

FROM子句中select的目的是创建一个至少有一个项目被批准的日期列表,因为我知道每个工作日至少会批准一个项目。 我的意图是在那个日期列表中填入每天的计数。

最终总结问题:

如何创建一个日期数组,然后通过让系统计算当该日期等于或等于date1(批准日期)之前或等于date2(发布时)来填写查询日期)。

我提前感谢你阅读这个长期的问题。我更感谢所有建设性的反馈和想法。

干杯,

1 个答案:

答案 0 :(得分:0)

生成所有日期的列表,并指示开放计数是增加1(已批准)还是减少一(已释放)。然后,累积金额是你的答案。以下查询执行此操作,但您可能需要调整结果:

with dates as (
       (select greatest(osd.date_approved, trunc(sysdate) - interval '1 year' - interval '1 day') as dte,
               count(*) as inc
        from mm_oracle_sig_dates osd
        where osd.date_released >= trunc(sysdate) - interval '1 year' or 
              osd.date_released is null
        group by osd.date_approved
       ) union all
       (select osd.date_released + 1 as dte, -count(*) as inc
        from mm_oracle_sig_dates osd
        where osd.date_released >= trunc(sysdate) - interval '1 year' or
              osd.date_released is null
        group by osd.date_released
       )
      )
select dte,
       sum(sum(inc)) over (order by dte) as openitems
from dates
group by dte;

注意:

  • dates按批准和发布日期汇总数据。请注意,发布日期增加1以符合您的业务规则。
  • 只有在过去一年中尚未发布或已发布的记录才会包含在人口中。两个子查询使用相同的where子句。
  • 超过一年前的所有审批都在同一天签署。
  • 然后外部查询只是按日累计总和。

如果结果集中未包含所有日期,则可以将其包含在dates中,inc值为0