2013-05-07 3 views
0

나는 두 가지 별도의 쿼리를 결합하고 싶지만 원하는 결과를 얻으려고 애 쓰고 있습니다. 하나는 테이블의 모든 값을 요약하고 다른 하나는 최근 날짜를 기준으로 중복 행을 선택합니다. 첫 번째 쿼리의SQL IN 또는 EXISTS 절 문제

단축 된 버전입니다 :

SELECT a.PLANT_NO "PlantNumber", 
     SUM(CASE WHEN a.REC_STATUS_CD = 'RR' THEN -a.KW_CTR_REDELIVERED_HV 
       ELSE a.KW_CTR_REDELIVERED_HV END) "KeepWholeResidueMMBtu", 
     SUM(a.ETH_APPLIED_POP_PCT + a.ISO_APPLIED_POP_PCT + 
      (CASE WHEN a.PLANT_NO = '002' THEN a.ALTLIQ_APPLIED_POP_PCT ELSE 0 END) 
     )/100 "NGLPOPPaymentPercent" 
FROM GAS_STMT a 
INNER JOIN SETTLE_SUMMARY c 
    ON CASE WHEN SUBSTR(a.TRNX_ID,1,1) = '-' 
      THEN SUBSTR(a.TRNX_ID, 2, LENGTH(a.TRNX_ID)) 
      ELSE CAST(a.TRNX_ID AS VARCHAR2(100)) 
     END = c.TRNX_ID 
    AND a.MTR_NO||a.MTR_SFX = c.MTR_NO||c.MTR_SFX 
WHERE TO_CHAR(a.PROD_DT, 'YYYY') >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYY') 
    AND a.STATUS_UNIT_TM_CD = 'M' 
GROUP BY a.PLANT_NO 
ORDER BY a.PLANT_NO 

다른 쿼리는 가장 최근의 거래 날짜를 기준으로 네 개의 트랜잭션을 필터링하는 데 사용됩니다.

SELECT a.* 
FROM GAS_STMT a, 
    (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT 
     FROM GAS_STMT 
     WHERE REC_STATUS_CD = 'RR' 
     GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD 
     HAVING COUNT(TRNX_ID) > 1) b 
WHERE a.MTR_NO = b.MTR_NO 
    AND a.TRNX_ID = b.TRNX_ID AND a.REC_STATUS_CD = b.REC_STATUS_CD 
    AND a.ACCT_DT = b.ACCT_DT 
내가 NOT IN 또는 NOT EXISTS이 두 번째 쿼리에서 제외하는 네 개의 레코드를 제외하고 첫 번째 쿼리의 합이 모든 것을 가지고 어디 사용할 수 있다고 생각

. 사용 EXISTS 첫 번째 쿼리와 동일한 결과를 얻고 NOT EXISTS을 사용하여 결과가 없습니다. 내가 IN을 사용할 때 내가 원하는 것과 반대되는 제외 된 레코드의 합계를 얻습니다.

PL/SQL에서이를 수행하는 좋은 방법이 있습니까? 나는 NOT EXISTS 쿼리에 대한 레코드를 얻지 못하고 혼란 스럽습니다. 먼저 조회 결과의

예 :

  1. Plant_No - 합계
  2. 002-100
  3. 450-50
  4. 500-50
제 조회 결과 7백45경1천5백15조5백36억9천1백36만3천2백10

예 :

  1. Trnx_ID - Plant_no - KW_CTR_REDELIVERED_HV
  2. 1234-002 - -.99
  3. 1235-002 - -.99

의도 한 결과 :

  1. Plant_No - 합계
  2. 002-98.02
  3. 450-50
  4. 500-50
+1

왜 두 번째 쿼리에서 SQLServer 관련 이름 인용 문자 (예 :'[]')를 사용하는 경우 (Oracle) PL/SQL에 대해 이야기하고 있습니까? –

+0

또한 두 번째 쿼리의 마지막 줄에는 'AND a.ACCT_DT = b.ACCT_DTenter code here' -'여기에 코드 입력 '대신 추가 코드를 입력해야합니까? –

+0

죄송합니다. Management Studio에서 일부 작업을하고있었습니다. 그 끝에는 추가 코드가 없습니다. – jackirons

답변

1

에 표시 할 첫 번째 쿼리에서 만 행에서 모든 것을 얻을 그런 식으로 시도 :

SELECT a.PLANT_NO "PlantNumber", 
     SUM(CASE WHEN a.REC_STATUS_CD = 'RR' THEN -a.KW_CTR_REDELIVERED_HV 
       ELSE a.KW_CTR_REDELIVERED_HV END) "KeepWholeResidueMMBtu", 
     SUM(a.ETH_APPLIED_POP_PCT + a.ISO_APPLIED_POP_PCT + 
      (CASE WHEN a.PLANT_NO = '002' THEN a.ALTLIQ_APPLIED_POP_PCT ELSE 0 END) 
     )/100 "NGLPOPPaymentPercent" 
FROM GAS_STMT a 
INNER JOIN SETTLE_SUMMARY c 
    ON CASE WHEN SUBSTR(a.TRNX_ID,1,1) = '-' 
      THEN SUBSTR(a.TRNX_ID, 2, LENGTH(a.TRNX_ID)) 
      ELSE CAST(a.TRNX_ID AS VARCHAR2(100)) 
     END = c.TRNX_ID 
    AND a.MTR_NO||a.MTR_SFX = c.MTR_NO||c.MTR_SFX 
LEFT JOIN (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT 
      FROM GAS_STMT 
      WHERE REC_STATUS_CD = 'RR' 
      GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD 
      HAVING COUNT(TRNX_ID) > 1) b 
    ON a.MTR_NO = b.MTR_NO 
    AND a.TRNX_ID = b.TRNX_ID 
    AND a.REC_STATUS_CD = b.REC_STATUS_CD 
    AND a.ACCT_DT = b.ACCT_DT 
WHERE TO_CHAR(a.PROD_DT, 'YYYY') >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYY') 
    AND a.STATUS_UNIT_TM_CD = 'M' 
    AND b.MTR_NO IS NULL 
GROUP BY a.PLANT_NO 
ORDER BY a.PLANT_NO 
+0

감사합니다. 마크! 그건 의미가 있습니다. – jackirons

+0

@jackirons : 다행스럽게 도울 수 있습니다. –

0

받는 사람에 두 번째 쿼리에서 B 가입 먼저 두 번째 쿼리가 수행하는 것과 같은 방식으로 쿼리합니다. 즉

inner join (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT 
    FROM GAS_STMT 
    WHERE REC_STATUS_CD = 'RR' 
    GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD 
    HAVING COUNT(TRNX_ID) > 1) b 
on a.MTR_NO = b.MTR_NO 
    AND a.TRNX_ID = b.TRNX_ID AND a.REC_STATUS_CD = b.REC_STATUS_CD 
    AND a.ACCT_DT = b.ACCT_DT 

당신이 두 번째 쿼리에 의해 반환 레코드를 제외하려면 원하는 경우 두 번째 쿼리

+0

답변 해 주셔서 감사합니다. – jackirons