2017-12-26 3 views
0

Oracleレポートのデータを2つのレポートに分類する必要があります。以下はすべてを整理するための私の質問です。今の私は、一般的に、私はこの条件で値にnull以外を除外し、条件未満

WHERE ((CHQ_NO IS NOT NULL AND **CHQ_AMT>50000**) 
or (CATEGORY='3' AND **CHQ_AMT>10000**)) 

1. FIRST REPORT

ない client_noを除外したいと思い、次の条件

と他のレポートに示されているすべてのデータを除外する必要があります二つ目のレポートの

WHERE ((CHQ_NO IS NOT NULL AND CHQ_AMT>50000) or (CATEGORY='3' AND CHQ_AMT>10000))

私は、以下の条件を使用し、それが最初のレポートから条件を除外する必要があります。以下は

SECOND REPORT
WHERE ((CHQ_NO IS NOT NULL AND CHQ_AMT<50000) or (CATEGORY='3' AND CHQ_AMT<10000))

私のコーディングであり、それは現在、除外が正確に50,000である量をチェックしているようにコードことに注意してください1

SELECT CLIENT_NO, 
     sum(decode(category,'3',decode(nvl(cancel_flag,'N'),'N',1,-2) ,0)) CASH, 
     sum(decode(chq_no, null,0, decode(nvl(cancel_flag,'N'),'N',1,-2))) CHQ, 
     0 YTD_PURCHASE, 
     0 YTD_SALES, 
     0 CURRENT_CRLIMIT, 
     0 CR_LIMIT 
FROM BOS_M_LEDGER_REC 
WHERE ((CHQ_NO IS NOT NULL AND CHQ_AMT<50000) or (CATEGORY='3' AND CHQ_AMT<10000)) 
and CLIENT_NO>=:P_CLIENT_NO_FROM 
AND CLIENT_NO <=:P_CLIENT_NO_TO 
AND TRAN_DATE>=:P_FROM_DATE 
AND TRAN_DATE<=:P_TO_DATE 
GROUP BY CLIENT_NO 
+0

これは明らかにOracleであるため、MySQLタグを削除しました。 –

+0

サブクエリを試行して、最初のクエリに存在するクライアントを除外できます。 –

+1

'WHERE((CHQ_NOはNULLではなく、CHQ_AMT <50000)または(CATEGORY = '3'およびCHQ_AMT <10000))'この条件では、レポート1の 'client_no'はすでに削除されていませんか?または私は何かを逃していますか? – Vashi

答えて

0

私は別名Bによって表されるサブクエリでレポート1のものclient_noを削除するロジックを追加しました。 client_noのリストはBで、完全外部結合はclient_noで、元のテーブル(別名Aのレポート2)に使用されています。これにより、A.client_no列とB.client_no列の両方に、不一致がある場合でもNULLが作成されます。

はその後、それはそこにA.client_noとの一致であり、あなたがすることを望んでいないこと、あなただけAではなくB [B.client_noがNULLでない場合FYIであるclient_noを持っていることを意味しますWHERE B.CLIENT_NO IS NULLを追加しましたレポート3のclient_no]。

私はクエリの他の場所で変更を加えませんでした。

SELECT A.CLIENT_NO, 
    sum(decode(category,'3',decode(nvl(cancel_flag,'N'),'N',1,-2) ,0)) CASH, 
    sum(decode(chq_no, null,0, decode(nvl(cancel_flag,'N'),'N',1,-2))) CHQ, 
    0 YTD_PURCHASE, 
    0 YTD_SALES, 
    0 CURRENT_CRLIMIT, 
    0 CR_LIMIT 
FROM BOS_M_LEDGER_REC A 
FULL OUTER JOIN 
(SELECT CLIENT_NO FROM BOS_M_LEDGER_REC WHERE ((CHQ_NO IS NOT NULL AND CHQ_AMT>=50000) or (CATEGORY='3' AND CHQ_AMT>=10000)) GROUP BY CLIENT_NO) B 
ON A.CLIENT_NO = B.CLIENT_NO 
WHERE B.CLIENT_NO IS NULL 
AND ((CHQ_NO IS NOT NULL AND CHQ_AMT<50000) or (CATEGORY='3' AND CHQ_AMT<10000)) 
AND A.CLIENT_NO>=:P_CLIENT_NO_FROM 
AND A.CLIENT_NO <=:P_CLIENT_NO_TO 
AND TRAN_DATE>=:P_FROM_DATE 
AND TRAN_DATE<=:P_TO_DATE 
GROUP BY A.CLIENT_NO; 
0

レポートを除外するために条件を追加する必要がありますいずれのレポートもこれらの値に正確に一致するものはありません.1つのレポートは上記の値を選択し、もう1つは下の値を選択するためです。私はこれが意図的なのか論理の見落としなのか分かりません。

WITH common_report_subquery AS 
(
    SELECT 
     CLIENT_NO 

     ,DECODE(
       category 
       ,'3', DECODE(
          NVL(cancel_flag, 'N') 
          ,'N', 1 
          ,-2 
          ) 
       ,0 
      ) AS CASH 

     ,DECODE(
       chq_no 
       ,NULL, 0 
       ,DECODE(
         NVL(cancel_flag, 'N') 
         ,'N', 1 
         ,-2 
         ) 
      ) AS CHQ 


     ,IIF(
       ((CHQ_NO IS NOT NULL AND CHQ_AMT>50000) or (CATEGORY='3' AND CHQ_AMT>10000)) 
       ,1 
       ,0 
      ) AS MEETS_FIRST_REPORT_CRITERIA 

     ,IIF(
       ((CHQ_NO IS NOT NULL AND CHQ_AMT<50000) or (CATEGORY='3' AND CHQ_AMT<10000)) 
       ,1 
       ,0 
      ) AS MEETS_SECOND_REPORT_CRITERIA 


    FROM 
     BOS_M_LEDGER_REC 

    WHERE 
     (CLIENT_NO BETWEEN :P_CLIENT_NO_FROM AND :P_CLIENT_NO_TO) 
     AND 
     (TRAN_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE) 
) 

,first_report AS 
(
    SELECT 
     CLIENT_NO 
     ,SUM(CASH) AS CASH 
     ,SUM(CHQ) AS CHQ 

     ,0 AS YTD_PURCHASE 
     ,0 AS YTD_SALES 
     ,0 AS CURRENT_CRLIMIT 
     ,0 AS CR_LIMIT 

    FROM 
     common_report_subquery 

    WHERE 
     (MEETS_FIRST_REPORT_CRITERIA = 1) 

    GROUP BY 
     CLIENT_NO 

) 

,second_report_subquery AS 
(
    SELECT 
     * 
     ,MAX(MEETS_FIRST_REPORT_CRITERIA) OVER (PARTITION BY CLIENT_NO ORDER BY NULL) AS CLIENT_APPEARS_ON_FIRST_REPORT 

    FROM 
     common_report_subquery 

) 

,second_report AS 
(
    SELECT 
     CLIENT_NO 
     ,SUM(CASH) AS CASH 
     ,SUM(CHQ) AS CHQ 

     ,0 AS YTD_PURCHASE 
     ,0 AS YTD_SALES 
     ,0 AS CURRENT_CRLIMIT 
     ,0 AS CR_LIMIT 

    FROM 
     second_report_subquery 

    WHERE 
     (MEETS_SECOND_REPORT_CRITERIA = 1) 
     AND 
     --excludes consideration of any rows for clients that met the criteria for inclusion on the first report 
     (CLIENT_APPEARS_ON_FIRST_REPORT = 0) 

    GROUP BY 
     CLIENT_NO 
) 

--uncomment the relevant line below for each report 
--SELECT * FROM first_report 
--SELECT * FROM second_report 
関連する問題