-1

UNION私はSQLの完全な初心者であり、必要な結果まで2つのクエリを持っていますが、それらを組み合わせるために正しく使用していないと思います。クエリの一部について、以前にこのサイトでいくつかの助けがありました。以下は、私が持っているものの短縮版です。

WITH RemoveData
     AS (SELECT a.PLANT_NO,
                a.ALLOC_WHDV_VOL,
                a.KW_CTR_REDELIVERED_HV,
                a.MTR_NO,
                a.MTR_SFX,
                a.TRNX_ID,
                a.REC_STATUS_CD,
                MAX(a.ACCT_DT) ACCT_DT
         FROM   GasStmt a
                INNER JOIN SettleSum c
                  ON a .= c.TRNX_ID
                     AND a.MTR_NO
                         ||a.MTR_SFX = c.MTR_NO
                                       ||c.MTR_SFX
                LEFT OUTER JOIN FuelsCat d
                  ON a.TRNX_ID = d.TRNX_ID
                     AND a.MTR_NO
                         ||a.MTR_SFX = d.MTR_NO
                                       ||d.MTR_SFX
         WHERE  a.REC_STATUS_CD = 'RR'
         GROUP  BY a.PLANT_NO,
                   a.ALLOC_WHDV_VOL,
                   a.KW_CTR_REDELIVERED_HV,
                   a.MTR_NO,
                   a.MTR_SFX,
                   a.TRNX_ID,
                   a.REC_STATUS_CD
         HAVING COUNT(a.REC_STATUS_CD) > 2) 
SELECT plant_no                   "PlantNumber",
       SUM(-a.ALLOC_WHDV_VOL)     "PlantStandardGrossWellheadMcf",
       SUM(KW_CTR_REDELIVERED_HV) "KeepWholeResidueMMBtu"
FROM   RemoveData a
GROUP  BY plant_no
UNION
SELECT a.PLANT_NO            "PlantNumber",
       SUM(a.ALLOC_WHDV_VOL) "PlantStandardGrossWellheadMcf",
       SUM(CASE
             WHEN a.REC_STATUS_CD = 'RR' THEN -a.KW_CTR_REDELIVERED_HV
             ELSE a.KW_CTR_REDELIVERED_HV
           END)              "KeepWholeResidueMMBtu"
FROM   GasStmt a
       INNER JOIN SettleSum c
         ON a.TRNX_ID = c.TRNX_ID
            AND a.MTR_NO
                ||a.MTR_SFX = c.MTR_NO
                              ||c.MTR_SFX
       LEFT OUTER JOIN FuelsCat d
         ON a.TRNX_ID = d.TRNX_ID
            AND a.MTR_NO
                ||a.MTR_SFX = d.MTR_NO
                              ||d.MTR_SFX
       LEFT OUTER JOIN (SELECT MTR_NO,
                               MTR_SFX,
                               TRNX_ID,
                               REC_STATUS_CD,
                               MAX(ACCT_DT) ACCT_DT
                        FROM   GasStmt
                        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 

上記のクエリは次を返します。

PlantNumber | PlantStandardGrossWellheadMcf    |KeepWholeResidueMMBtu
2           | 0                                | -3.96
2           | 80                               |  100
43          | 150                              |  0
133         | 75                               |  0

CTE だけで最初のクエリを実行すると、次のようになります。

PlantNumber | PlantStandardGrossWellheadMcf  |KeepWholeResidueMMBtu
2           | 0                              |-3.96

2 番目のクエリを単独で実行して、取得したサンプル データの例を次に示します。

PlantNumber | PlantStandardGrossWellheadMcf    |KeepWholeResidueMMBtu
2           | 80                               |  100
43          | 150                              |  0
133         | 75                               |  0

私の意図した結果は、植物番号に基づいてデータを結合することです。それはUNIONで行うことができますか、それとも何か間違っていますか? これは私が達成したいと思っていることです:

PlantNumber | PlantStandardGrossWellheadMcf    |KeepWholeResidueMMBtu
2           | 80                               |  96.04
43          | 150                              |  0
133         | 75                               |  0
4

1 に答える 1

1

サブクエリとして UNION ステートメントの結果に対して集計関数を実行できます。特定の DBMS に応じていくつかのバリエーションがある場合がありますが、このサンプル メタコードは概念を説明する必要があります。

SELECT "Results".ColA, "Results".SUM(ColB), "Results".SUM(ColC)
FROM (
      SELECT ColA, ColB, ColC
      FROM SomeTable1
      INNER JOIN SomeOtherTable1
      WHERE Criteria

      UNION

      SELECT ColA, ColB, ColC
      FROM SomeTable2
      INNER JOIN SomeOtherTable2
      WHERE Criteria
     ) "Results"

GROUP BY "Results".ColA
于 2013-06-12T19:59:54.870 に答える