0

結合したい 2 つの別々のクエリがありますが、希望する結果を得るのに苦労しています。1 つはテーブル内のすべての値を要約し、もう 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
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

もう 1 つのクエリは、最新の取引日に基づいて 4 つの取引を除外するために使用されます。

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 INwhereまたはNOT EXISTSto を使用して、2 番目のクエリで除外された 4 つのレコードを除いて、最初のクエリですべてを合計できると思います。Iを使用EXISTSすると、最初のクエリ自体と同じ結果が得られ、 I を使用しNOT EXISTSても結果は得られません。私が使用するINと、除外されたレコードの合計が得られますが、これは私が望むものとは逆です。

PL/SQLでこれを行う良い方法はありますか? クエリのレコードを取得していないことに混乱していNOT EXISTSます。

最初のクエリ結果の例:

  1. Plant_No -合計
  2. 002 - 100
  3. 450 - 50
  4. 500 - 50

2 番目のクエリ結果の例:

  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
4

2 に答える 2