2017-06-03 101 views
1

我有查詢下一個問題組通過與null值選擇最大

SELECT 
T.DETALLE_BECA_ANIO anio, 
T.DETALLE_BECA_MES mes, 
T.DETALLE_BECA_NIVEL_EDU_ID edu_id, 
T.DETALLE_BECA_TRAMO_ID tr_id, 

MAX(
CASE 
    WHEN T.DETALLE_BECA_TIPO_BENE_ID IS NULL 
    THEN NVL(DETALLE_BECA_VALOR,0) 
    ELSE 0 
END) mant , 
MAX(
    CASE 
    WHEN T.DETALLE_BECA_TIPO_BENE_ID = 1 
    THEN NVL(DETALLE_BECA_VALOR,0) 
    ELSE 0 
    END) tras 
    FROM 
(SELECT DETALLE_BECA_NIVEL_EDU_ID, 
    DETALLE_BECA_BECA_ID, 
    DETALLE_BECA_TIPO_BENE_ID, 
    DETALLE_BECA_VALOR, 
    DETALLE_BECA_MES, 
    DETALLE_BECA_REGION_ID, 
    DETALLE_BECA_PROVINCIA_ID, 
    DETALLE_BECA_ANIO, 
    DETALLE_BECA_TRAMO_ID, 
    DETALLE_BECA_COMUNA_ID 
FROM TBL_DETALLE_BECAS 

WHERE (DETALLE_BECA_TIPO_BENE_ID = 1 
OR DETALLE_BECA_TIPO_BENE_ID IS NULL) 
and DETALLE_BECA_BECA_ID = 1 
and detalle_beca_mes = 3 
) T 
GROUP BY T.DETALLE_BECA_BECA_ID, 
T.DETALLE_BECA_TRAMO_ID, 
T.DETALLE_BECA_REGION_ID, 
T.DETALLE_BECA_PROVINCIA_ID, 
T.DETALLE_BECA_ANIO, 
T.DETALLE_BECA_MES, 
T.DETALLE_BECA_NIVEL_EDU_ID, 
T.DETALLE_BECA_COMUNA_ID 
ORDER BY T.DETALLE_BECA_BECA_ID, 
T.DETALLE_BECA_MES, 
T.DETALLE_BECA_NIVEL_EDU_ID 

輸出:

"ANIO" "MES" "EDU_ID" "TR_ID" "MANT" "TRAS" 
    2017  3   2  0.62  0  NULL 
    2017  3   3  1.24  6  NULL 
    2017  3  NULL  1.0  NULL  1 

我需要的總和值,其中EDU_ID是空與TR_ID值2,3並與EDU值替換null值在「重點稅源監控」爲空

"ANIO" "MES" "EDU_ID" "TR_ID" "MANT" "TRAS" 
    2017  3   2  1.62  0  1 
    2017  3   3  2.24  6  1 

我所著的查詢與分(edu_id)或最大(edu_id),但沒能解決我的p roblem。

是發生在我的另一件事是做一個與同桌

+1

編輯你的問題,並提供樣本數據和預期的結果,你要使用的行組合邏輯的解釋。 –

回答

0

首先,這使得更多的意義,因爲你的查詢加入:只有

SELECT T.DETALLE_BECA_ANIO as anio, T.DETALLE_BECA_MES as mes, 
     T.DETALLE_BECA_NIVEL_EDU_ID as edu_id, T.DETALLE_BECA_TRAMO_ID as tr_id, 
     MAX(CASE WHEN T.DETALLE_BECA_TIPO_BENE_ID IS NULL 
       THEN NVL(DETALLE_BECA_VALOR, 0) 
       ELSE 0 
      END) as mant , 
     MAX(CASE WHEN T.DETALLE_BECA_TIPO_BENE_ID = 1 
       THEN NVL(DETALLE_BECA_VALOR,0) 
       ELSE 0 
      END) tras 
FROM TBL_DETALLE_BECAS 
WHERE (DETALLE_BECA_TIPO_BENE_ID = 1 OR DETALLE_BECA_TIPO_BENE_ID IS NULL) AND 
     DETALLE_BECA_BECA_ID = 1 AND 
     detalle_beca_mes = 3 
GROUP BY T.DETALLE_BECA_ANIO, T.DETALLE_BECA_MES, 
     T.DETALLE_BECA_NIVEL_EDU_ID, T.DETALLE_BECA_TRAMO_ID 
ORDER BY T.DETALLE_BECA_BECA_ID, T.DETALLE_BECA_MES, T.DETALLE_BECA_NIVEL_EDU_ID; 

這消除子查詢(不必要的)和按返回的列彙總。正確的查詢可能會解決您的問題。

但是,您似乎想要使用NULL爲其他列的「全部」。如果是這樣,像這樣將工作:

WITH t as (
     SELECT T.DETALLE_BECA_ANIO as anio, T.DETALLE_BECA_MES as mes, 
      T.DETALLE_BECA_NIVEL_EDU_ID as edu_id, T.DETALLE_BECA_TRAMO_ID as tr_id, 
      MAX(CASE WHEN T.DETALLE_BECA_TIPO_BENE_ID IS NULL 
         THEN NVL(DETALLE_BECA_VALOR, 0) 
         ELSE 0 
       END) as mant , 
      MAX(CASE WHEN T.DETALLE_BECA_TIPO_BENE_ID = 1 
         THEN NVL(DETALLE_BECA_VALOR,0) 
         ELSE 0 
       END) tras 
     FROM TBL_DETALLE_BECAS 
     WHERE (DETALLE_BECA_TIPO_BENE_ID = 1 OR DETALLE_BECA_TIPO_BENE_ID IS NULL) AND 
      DETALLE_BECA_BECA_ID = 1 AND 
      detalle_beca_mes = 3 
     GROUP BY T.DETALLE_BECA_ANIO, T.DETALLE_BECA_MES, 
      T.DETALLE_BECA_NIVEL_EDU_ID, T.DETALLE_BECA_TRAMO_ID 
    ) 
SELECT t.ANIO, t.MES, t.EDU_ID, 
     COALESCE(t.TR_ID, 0) + COALESCE(tnull.TR_ID, 0) as TR_ID, 
     t.MANT, 
     COALESCE(t.TRAS, 0) + COALESCE(tnull.TRAS, 0) as TRAS 
FROM t LEFT JOIN 
    (SELECT t.* 
     FROM t 
     WHERE t.edu_id IS NULL 
    ) tnull 
    ON tnull.ANIO = t.ANIO AND tnull.MES = t.MES 
WHERE t.edu_id IS NOT NULL 
ORDER BY T.DETALLE_BECA_BECA_ID, T.DETALLE_BECA_MES, T.DETALLE_BECA_NIVEL_EDU_ID; 
+0

感謝您的幫助,我通過分析您的查詢瞭解了很多 – DonSata