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
我认为我可以使用whereNOT 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:很高兴我能帮上忙。