ORACLE SQL: Fill in missing dates

后端 未结 3 500
逝去的感伤
逝去的感伤 2020-12-04 02:42

I have the following code which gives me production dates and production volumes for a thirty day period.

select 
(case when trunc(so.revised_due_date) <=         


        
3条回答
  •  悲哀的现实
    2020-12-04 03:36

    you can get the gaps by using connect by and a left join:

    assuming your schema is:

    create table tbl(DUE_DATE date, CD_OF_VOLUME float);
    insert into tbl values(to_date('14/04/2015','DD/MM/YYYY'),35267.00);
    insert into tbl values(to_date('15/04/2015','DD/MM/YYYY'),71744.00); 
    insert into tbl values(to_date('16/04/2015','DD/MM/YYYY'),20268.00); 
    insert into tbl values(to_date('17/04/2015','DD/MM/YYYY'),35156.00); 
    insert into tbl values(to_date('18/04/2015','DD/MM/YYYY'),74395.00); 
    insert into tbl values(to_date('19/04/2015','DD/MM/YYYY'),3636.00); 
    insert into tbl values(to_date('21/04/2015','DD/MM/YYYY'),5522.00);
    insert into tbl values(to_date('22/04/2015','DD/MM/YYYY'),15502.00);
    insert into tbl values(to_date('04/05/2015','DD/MM/YYYY'),10082.00);
    

    you can say:

    with cte as
    (
      select (select min(DUE_DATE)-1 from tbl)+ level as dt
      from dual
      connect by level <= (select max(DUE_DATE)-min(DUE_DATE) from tbl)
    )
    select to_char(c.dt,'DD/MM/YYYY') gap,null volume 
    from cte c
    left join tbl t on c.dt=t.DUE_DATE
    where t.DUE_DATE is null
    order by c.dt
    

    Result:

    GAP         VOLUME
    20/04/2015  (null)
    23/04/2015  (null)
    24/04/2015  (null)
    25/04/2015  (null)
    26/04/2015  (null)
    27/04/2015  (null)
    28/04/2015  (null)
    29/04/2015  (null)
    30/04/2015  (null)
    01/05/2015  (null)
    02/05/2015  (null)
    03/05/2015  (null)
    

    Notice: you can implement this in your original query, one simplest way is to wrap your query and use it as a subquery instead of tbl in above code snippet.

提交回复
热议问题