2016/05/06

前年同月比較、前月比較 - 売上日報 SQL


  • Goal
    セールス別に、当月の売上、前年同月、前月を横並びで表示する。レポートのタイミングはオンデマンドを想定しているので、売上明細からSQLで取り出しを行う。
  • How
    1. 月別グルーピング用のフラグを、明細に追加
    2. DECODE文で、必要な値だけサマリー(条件付きサマリー)
    3. GROUP BY ROLLUP で、合計行 を追加
     
  • Source

    -- SALES別売上レポートサンプル
    SELECT CASE WHEN GROUPING(X.SALESNAME)=1 then '[Total]'
    ELSE X.SALESNAME
    END SALESNAME -- [Total] を集計行には表示する
    , SUM(DECODE(X.MFLAG,0,X.AMT,0)) TM --当月
    , SUM(DECODE(X.MFLAG,-1,X.AMT,0)) MOM --先月
    , SUM(DECODE(X.MFLAG,-2,X.AMT,0)) L2M --先先月
    , SUM(DECODE(X.MFLAG,-13,X.AMT,0)) YOY --前年同月
    FROM
    (--- 以下、売上明細の整形, VIEWに切り出すか、MVIEWでどっかにおくべき??
    select A.<GL_DATE> GL_DATE
    , A.<SALES_NAME> SALESNAME
    , A.<AMOUNT> AMT
    -- 月の集計フラグを追加
    , case when to_char(A.<GL_DATE>,'YYYYMM')=to_char(sysdate),'YYYYMM') --当月
    then 0
    when to_char(A.<GL_DATE>,'YYYYMM')=to_char(add_months(sysdate,-1),'YYYYMM') --先月
    then -1
    when to_char(A.<GL_DATE>,'YYYYMM') = to_char(add_months(sysdate,-2),'YYYYMM') --先々月
    then -2
    when to_char(A.<GL_DATE>,'YYYYMM') = to_char(add_months(sysdate,-13),'YYYYMM') --前年同月
    then -13
    ELSE 1
    END MFLAG
    FROM <SALES_LINE> A
    WHERE A.<GL_DATE> >= to_date('01/'||to_char(add_months(sysdate,-13),'MM/YYYY'), 'DD/MM/YYYY')
    ) X
    GROUP BY ROLLUP ( A.<SALES_NAME> ) -- ROLLUPで合計行を追加
    ORDER BY A.<SALES_NAME>
    ;
    view raw YoY_MoM.sql hosted with ❤ by GitHub
    SALESNAME TM MOM L2M YOY
    -------------------------- ---------- ---------- ---------- ----------
    SALES1 1021 518 352 363
    SALES2 58 65 54 46
    SALES3 155 126 123 94
    SALES4 70 47 57 67
    [Total] 1304 756 586 570
    #ちょっと今月売上良すぎだけど...

0 件のコメント:

コメントを投稿