2017-06-03 72 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