2013-05-07 49 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 INNOT EXISTS有第一个查询和一切,除了这四个记录排除在第二个查询。 使用EXISTS我得到了与第一个查询本身相同的结果,并使用NOT EXISTS我没有得到任何结果。当我使用IN时,我得到了与我想要的相反的排除记录的总和。

在PL/SQL中有这样做的好方法吗?我很困惑,我没有得到NOT EXISTS查询的任何记录。的第一查询结果

实施例:

  1. Plant_No - 萨姆
  2. 002 - 100
  3. 450 - 50
  4. 500 - 50
的第二查询结果

实施例:

  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? – 2013-05-07 20:03:28

+0

另外,第二个查询的最后一行显示:'AND a.ACCT_DT = b.ACCT_DTenter code here' - 应该输入哪些附加代码而不是'在此输入代码'? – 2013-05-07 20:10:14

+0

对不起。我在Management Studio中工作了一部分。在最后没有任何额外的代码。 – jackirons 2013-05-07 20:14:54

回答

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 2013-05-07 21:50:22

+0

@jackirons:很高兴我能帮上忙。 – 2013-05-07 22:04:41

0

从所述第二查询JOIN 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 2013-05-07 21:51:52