2017-12-26 14 views
0

오라클 보고서의 데이터를 2 개의 보고서로 정리해야합니다. 다음은 모든 것을 정리하는 쿼리입니다. 지금 나는 일반적으로 내가이 상태에서 값null이 아니며 조건보다 작음

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

1. 첫 번째 보고서

아니라고 client_no을 제외 할 조건

다음

와 다른 보고서에 표시되는 모든 데이터를 제외해야

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

두 번째 보고서의 필자는 아래의 조건을 사용하고는 첫 번째 보고서에서 조건을 제외해야합니다.

SECOND 보고서
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))이 조건이 이미 Report1에있는 'client_no'를 제거하지 않았습니까? 또는 나는 무엇인가 놓치고 있냐? – Vashi

답변

0

나는 별명 B로 표시되는 하위 쿼리에 보고서 1과 client_no를 제거하는 로직을 추가했습니다. client_no의 목록을 B에 사용하고 원본 테이블 (별칭이 A 인 보고서 2)과 함께 client_no의 완전 외부 조인을 사용했습니다. 이렇게하면 불일치가있는 곳에서 A.client_no 및 B.client_no 열 모두에 NULL이 생성됩니다.

는 그런 다음이 A.client_no와 일치이며 것을 원하지 않는 의미, 당신은 단지 A에하지 B [B.client_no이 NULL이 아닌 참고 경우에 client_no이있을 것이다 의미 WHERE B.CLIENT_NO IS NULL 추가 client_no in report 3]]을 누르십시오.

쿼리의 다른 부분을 변경하지 않았습니다.

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

를 제외하는 조건을 추가 할 필요가 두 보고서 모두 10,000 개가 아닙니다. 두 값 모두 정확히 일치하지 않으므로 하나의 보고서는 위의 값을 선택하고 다른 하나는 아래의 값을 선택합니다. 나는 그것이 이것이 의도적인지 논리의 감독인지는 모른다.

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