2017-02-17 4 views
0

oracleのwhenとsubクエリで完全外部結合クエリがあります。私が達成しようとしているのは、今年のデータと前年のデータを同じテーブルから集計して比較することです。しかし、私のFULL OUTER JOINは、今年と前年の両方からnull値を返さない内部結合として機能しています。ここで"case with"とサブクエリの完全外部結合

は私のコードです:

SELECT 
    SQ1.CHANNEL, 
    SQ1.SHORT, 
    SQ1.NAME, 
    SQ1.RDC, 
    SQ1.CY_APPROVED_COUNT, 
    SQ2.PY_APPROVED_COUNT, 
    SQ1.CY_APPROVED_VOLUME, 
    SQ2.PY_APPROVED_VOLUME, 
    SQ1.CY_DECLINED_COUNT, 
    SQ2.PY_DECLINED_COUNT, 
    SQ1.CY_DECLINED_VOLUME, 
    SQ2.PY_DECLINED_VOLUME, 
    SQ1.CY_RETURNED_COUNT, 
    SQ2.PY_RETURNED_COUNT, 
    SQ1.CY_RETURNED_VOLUME, 
    SQ2.PY_RETURNED_VOLUME 
FROM (SELECT 
      CHANNEL, 
      SHORT, 
      NAME, 
      RDC, 
      SUM (CASE WHEN STATUS = 'Approved' THEN APP_COUNTS ELSE 0 END) AS CY_APPROVED_COUNT, 
      SUM (CASE WHEN STATUS = 'Approved' THEN PROJ_VOL ELSE 0 END) AS CY_APPROVED_VOLUME, 
      SUM (CASE WHEN STATUS = 'Declined' THEN APP_COUNTS ELSE 0 END) AS CY_DECLINED_COUNT, 
      SUM (CASE WHEN STATUS = 'Declined' THEN PROJ_VOL ELSE 0 END) AS CY_DECLINED_VOLUME, 
      SUM (CASE WHEN STATUS = 'Returned' THEN APP_COUNTS ELSE 0 END) AS CY_RETURNED_COUNT, 
      SUM (CASE WHEN STATUS = 'Returned' THEN PROJ_VOL ELSE 0 END) AS CY_RETURNED_VOLUME 
     FROM WFRT_MSP_SP_MTD 
     WHERE PERIOD >= TO_DATE('2016/02/01', 'yyyy/mm/dd') 
     AND PERIOD <= TO_DATE('2016/02/13','yyyy/mm/dd') 
     AND CHANNEL = 'MSP' 
     AND RDC = 'BASE' 
     GROUP BY 
      CHANNEL, 
      SHORT, 
      NAME, 
      RDC 
) SQ1 
-- NOT CORRECTLY SHOWING NULL VALUES 
FULL OUTER JOIN 

(SELECT 
    CHANNEL, 
    SHORT, 
    NAME, 
    RDC, 
    SUM (CASE WHEN STATUS = 'Approved' THEN APP_COUNTS ELSE 0 END) AS PY_APPROVED_COUNT, 
    SUM (CASE WHEN STATUS = 'Approved' THEN PROJ_VOL ELSE 0 END) AS PY_APPROVED_VOLUME, 
    SUM (CASE WHEN STATUS = 'Declined' THEN APP_COUNTS ELSE 0 END) AS PY_DECLINED_COUNT, 
    SUM (CASE WHEN STATUS = 'Declined' THEN PROJ_VOL ELSE 0 END) AS PY_DECLINED_VOLUME, 
    SUM (CASE WHEN STATUS = 'Returned' THEN APP_COUNTS ELSE 0 END) AS PY_RETURNED_COUNT, 
    SUM (CASE WHEN STATUS = 'Returned' THEN PROJ_VOL ELSE 0 END) AS PY_RETURNED_VOLUME 
FROM WFRT_MSP_SP_MTD 
WHERE PERIOD >= TO_DATE('2015/02/01', 'yyyy/mm/dd') 
    AND PERIOD <= TO_DATE('2015/02/13','yyyy/mm/dd') 
    AND CHANNEL = 'MSP' 
    AND RDC = 'BASE' 
GROUP BY 
    CHANNEL, 
    SHORT, 
    NAME, 
    RDC 
) SQ2 
ON sq1.short = sq2.short 
; 

できれば助けてください。

+1

は可読性 –

答えて

2

ただ、条件付き集約を使用します。

SELECT CHANNEL, SHORT, NAME, RDC, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Approved' THEN APP_COUNTS ELSE 0 END) AS CY_APPROVED_COUNT, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Approved' THEN PROJ_VOL ELSE 0 END) AS cY_APPROVED_VOLUME, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Declined' THEN APP_COUNTS ELSE 0 END) AS CY_DECLINED_COUNT, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Declined' THEN PROJ_VOL ELSE 0 END) AS CY_DECLINED_VOLUME, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Returned' THEN APP_COUNTS ELSE 0 END) AS CY_RETURNED_COUNT, 
     SUM(CASE WHEN this_year = 1 AND STATUS = 'Returned' THEN PROJ_VOL ELSE 0 END) AS CY_RETURNED_VOLUME, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Approved' THEN APP_COUNTS ELSE 0 END) AS PY_APPROVED_COUNT, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Approved' THEN PROJ_VOL ELSE 0 END) AS PY_APPROVED_VOLUME, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Declined' THEN APP_COUNTS ELSE 0 END) AS PY_DECLINED_COUNT, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Declined' THEN PROJ_VOL ELSE 0 END) AS PY_DECLINED_VOLUME, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Returned' THEN APP_COUNTS ELSE 0 END) AS PY_RETURNED_COUNT, 
     SUM(CASE WHEN prev_year = 1 AND STATUS = 'Returned' THEN PROJ_VOL ELSE 0 END) AS PY_RETURNED_VOLUME 
FROM (SELECT msm.*, 
      (CASE WHEN PERIOD >= DATE '2015-02-01' AND 
         PERIOD <= '2015-02-13' 
        THEN 1 ELSE 0 
       END) as prev_year, 
      (CASE WHEN PERIOD >= DATE '2016-02-01' AND 
         PERIOD <= '2016-02-13' 
        THEN 1 ELSE 0 
       END) as this_year 
     FROM WFRT_MSP_SP_MTD msm 
    ) msm 
WHERE CHANNEL = 'MSP' AND RDC = 'BASE' 
GROUP BY CHANNEL, SHORT, NAME, RDC; 
+0

のためのいくつかのインデントを使用することを助けるかもしれない、私はORA-00904を取得しています: "MSM":無効な識別子 00904. 00000 - "%sの:無効な識別子" – dmoses

+0

@dmosesは単に 'msm'エイリアスをサブクエリの閉じ括弧の外側からその内側に移動するだけです(つまり、サブクエリ自体ではなく、サブクエリ内のテーブルをエイリアスする必要があります)。 – Boneist

+0

@Boneistサブクエリ "wfrt_msp_sp_mtd"のテーブルの横に "msm"を移動し、エラーメッセージ "literal is format string"と一致しませんでした – dmoses

関連する問題