sql >> データベース >  >> RDS >> Oracle

ORACLE SQL:不足している日付を入力します

    SYSDATEから30日間の期間を取得できます 次のようになります(SYSDATEを含めると仮定します ?):

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

    次に、上記を使用してLEFT JOINを実行します クエリを使用する(おそらく、クエリをCTEに入れるのも悪い考えではありません):

    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;
    

    NULLの代わりに、「欠落している」日付にゼロを表示したい場合 、COALESCE(myorders.cd_of_volume, 0) AS cd_of_volumeを使用します 上記。



    1. Railsの移行:PostgreSQL上のBigintが失敗しているようですか?

    2. 列データの更新でPostgresエラーが発生しました

    3. 無効な構文エラータイプ=Hibernateによって生成されたDDLのMyISAM

    4. SCDタイプ2