2013-06-12 70 views
-1

我是一個完整的新手與SQL和有兩個查詢到我想要的結果,但我認爲我沒有正確使用UNION來組合它們。我早些時候在這個網站上獲得了一些查詢的幫助。 下面是我所擁有的簡短版本。SQL聯盟與CTE和總和

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 

自身運行第二個查詢,這裏是我得到的樣本數據的一個例子:

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 
+0

對不起,我試圖做一些它的短,嘎吱嘎吱一些東西。我改變了一點,希望它更易讀。 – jackirons

+0

你最好把問題縮減到最短的例子。沒有人想要閱讀所有這些。 –

回答

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 
+0

謝謝你的迴應。在查看以前用戶的帖子後,我嘗試了更早的版本。當我嘗試:'SELECT PLANT_NO,SUM(a.ALLOC_WHDV_VOL),SUM(KW_CTR_REDELIVERED_HV)FROM(...我的上面的查詢...)GROUP BY PLANT_NO'它說PLANT_NO是一個無效的標識符。如果我通過它刪除組,說KW_CTR_REDELIVERED_HV是一個無效的標識符。我錯過了明顯的東西嗎? – jackirons

+0

然後,您可能需要指定別名。我編輯了我的回覆,以顯示整個UNION語句的名稱爲「Results」,每個SELECT和GROUP BY都會指定「Results」項目。 您也可以嘗試在_with_語句中定義UNION,然後從其中選擇/分組:WITH(SELECT ... UNION SELECT ...)AS「Results」 SELECT「Results」.ColA,「Results」。 SUM(ColB),「Results」.SUM(ColC) GROUP BY「Results」.ColA' – Josh

+0

再次感謝您的快速響應。它似乎是一個別名問題,但我不能在我的生活中弄明白。它或者說無效標識符或者查詢沒有正確結束。我已經嘗試了GROUP BY結果.PLANT_NO,結果,.PLANT_NO,PlantNumber和幾乎所有我能想到的其他組合。我無法弄清楚如何引用子查詢中的列。 – jackirons