ORACLE SQL: Fill in missing dates

后端 未结 3 498
逝去的感伤
逝去的感伤 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:17

    You can get the 30-day period from SYSDATE as follows (I assume you want to include SYSDATE?):

    WITH mydates AS (
        SELECT TRUNC(SYSDATE) - 1 + LEVEL AS due_date FROM dual
       CONNECT BY LEVEL <= 31
    )
    

    Then use the above to do a LEFT JOIN with your query (perhaps not a bad idea to put your query in a CTE as well):

    WITH mydates AS (
        SELECT TRUNC(SYSDATE) - 1 + LEVEL AS due_date FROM dual
       CONNECT BY LEVEL <= 31
    ), myorders AS (
        select 
        (case when trunc(so.revised_due_date) <= trunc(sysdate) 
            then trunc(sysdate) else trunc(so.revised_due_date) end) due_date, 
        (case 
            when (case when sp.pr_typ in ('VV','VD') then 'DVD' when sp.pr_typ in ('RD','CD') 
            then 'CD' end) = 'CD' 
            and  (case when so.tec_criteria in ('PI','MC') 
            then 'XX' else so.tec_criteria end) = 'OF'
            then sum(so.revised_qty_due)
        end) CD_OF_VOLUME
        from shop_order so
        left join scm_prodtyp sp
        on so.prodtyp = sp.prodtyp
        where so.order_type = 'MD' 
        and so.plant = 'W' 
        and so.status_code between '4' and '8' 
        and trunc(so.revised_due_date) <= trunc(sysdate)+30
        group by trunc(so.revised_due_date), so.tec_criteria, sp.pr_typ
        order by trunc(so.revised_due_date)
    )
    SELECT mydates.due_date, myorders.cd_of_volume
      FROM mydates LEFT JOIN myorders
        ON mydates.due_date = myorders.due_date;
    

    If you want to show a zero on "missing" dates instead of a NULL, use COALESCE(myorders.cd_of_volume, 0) AS cd_of_volume above.

提交回复
热议问题