SQL IN或EXISTS子句问题

SQL IN或EXISTS子句问题,sql,plsql,subquery,Sql,Plsql,Subquery,我有两个独立的查询,我想合并,但我很难得到我想要的结果。一个汇总表中的所有值,另一个根据最近的日期选择重复的行 第一个查询的缩短版本为: 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

我有两个独立的查询,我想合并,但我很难得到我想要的结果。一个汇总表中的所有值,另一个根据最近的日期选择重复的行

第一个查询的缩短版本为:

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
我认为我可以使用where
NOT IN
NOT EXISTS
将第一个查询中排除的四条记录之外的所有记录相加。 使用
EXISTS
我得到与第一个查询相同的结果,使用
notexists
我没有得到任何结果。当我在中使用
时,我得到一个与我想要的相反的被排除记录的总和

在PL/SQL中有没有一种很好的方法可以做到这一点?我很困惑,我没有得到
不存在
查询的任何记录

第一个查询结果的示例:

  • 工厂编号-总和
  • 002-100
  • 450-50
  • 500-50
  • 第二个查询结果的示例:

  • Trnx\U ID-工厂号-KW\U中心重新交付的HV
  • 1234-002---.99
  • 1235-002---.99
  • 预期结果:

  • 工厂编号-总和
  • 002-98.02
  • 450-50
  • 500-50

  • 以与第二个查询相同的方式将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
    
    通过这种方式,您可以从第一个查询中获取所有信息,但只能从第二个查询中显示的行中获取信息

    如果要排除第二个查询返回的记录,请尝试:

    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
    

    当您的第二个查询使用SQLServer特定的名称引用字符(即
    []
    )时,您为什么要谈论(Oracle)PL/SQL?另外,第二个查询的最后一行是:
    和a.ACCT_DT=b.ACCT_DTenter code here
    -应该输入哪些其他代码而不是
    在此处输入代码
    ?对此表示抱歉。我曾在管理工作室工作过一段时间。最后没有任何附加代码。第二个查询是返回要排除的四条记录,还是返回除要排除的四条以外的所有记录?(从编码方式看,它看起来像前者,但从您的描述“另一个查询用于根据最近的交易日期筛选出四个交易。”,它看起来像后者。)第二个查询返回我要排除的四条记录。我应该填写示例数据,以显示12362002,-.99和12370002,-.99。再次为困惑感到抱歉。@jackirons:很高兴我能帮上忙。