Oracle - Como evitar la error división por 0

 
Vista:

Como evitar la error división por 0

Publicado por omarbri (1 intervención) el 18/04/2018 21:29:20
Hola amigos alguien seria tan amable de ayudarme con este script. El funciona bien pero cuando se requiere multiplicar a veces algunos campos están en 0 y genera error de multiplicación por 0. Este script genera un reporte donde indica el porcentaje del avance de notas cargadas al sistema por los profesores de un colegio.
Si todos han cargado aunque sea una nota no hay problemas pero, cuando todavía alguno no ha cargado nada se genera el error. Tal vez tenga que usar condicionales pero no se como, auxilio.
Gracias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
select U.ID_EMPL, U.USER_NOMBRECOMPLETO,
(select S.SUBA_DESCRIPCION FROM EDUTM_SUBAREA S
 WHERE S.ID_SUBA=C.ID_SUBA)
AS SubArea,
(select P.PLNE_DESCRIPCION FROM EDUTM_PLANESTUDIOS P
 WHERE P.ID_PLNE=C.ID_PLNE AND  P.AUDT_ACTIVO='1')
 AS GRADO,
 C.ID_SUBA,
 PK_CATALOGO.FN_S_CATALOGO(0, CTLG_SECCION)
 AS secc,
 (SELECT COUNT(*) FROM EDUTV_MATRICULAS P
 WHERE P.ID_PLNE=C.ID_PLNE /*and P.CTLG_SECCION=C.CTLG_SECCION*/ and P.MTRI_NROORDEN<>0)
 AS Mtri,
 EDUPK_NOTAS.FN_B_NOTASXINGRESAR(C.ID_PLNE, C.ID_SUBA,'0103805')
 AS NOTAS,
 EDUPK_NOTAS.FN_B_TOTALNOTASINGRESADAS(C.ID_PLNE, C.CTLG_SECCION, C.ID_SUBA,'0103805')
 AS INGRESADAS,
 
 round((EDUPK_NOTAS.FN_B_TOTALNOTASINGRESADAS(C.ID_PLNE, C.CTLG_SECCION, C.ID_SUBA,'0103805')*100) / 
 (EDUPK_NOTAS.FN_B_NOTASXINGRESAR(C.ID_PLNE, C.ID_SUBA,'0103805')* (SELECT COUNT(*) FROM EDUTV_MATRICULAS P
 WHERE P.ID_PLNE=C.ID_PLNE and P.CTLG_SECCION=C.CTLG_SECCION and P.MTRI_NROORDEN<>0)),2)
 AS Porcentaje
 
 
 from SEGTM_USUARIO U, ADMTM_EMPL_CARGALABORAL C--, EDUTM_ESNO_FECHAS E
WHERE C.ID_EMPL=U.ID_EMPL AND C.AUDT_ACTIVO='1' AND U.AUDT_ACTIVO='1' AND C.PLNE_ANIO='2018' and C.CTLG_PERIODO='0103805'
AND C.ID_PLNE is NOT NULL;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Como evitar la error división por 0

Publicado por leonardo_josue (46 intervenciones) el 19/04/2018 21:49:43
Hola omarbri:

Una opción sería evaluar con CASE-WHEN el divisor antes de que realices la división, y si es cero entonces no hacer la división, sino por ejemplo regresar un NULL, es decir, algo así;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  T.dividendo,
  T.divisor,
  CASE WHEN T.divisor != 0
    THEN T.dividendo / T.divisor
    ELSE null
  END division
FROM
( SELECT 20 dividendo, 2 divisor from dual
  UNION
  SELECT 5 dividendo,  0 divisor from dual
  UNION
  SELECT 0 dividendo,  5 divisor from dual
  UNION
  SELECT 0 dividendo,  0 divisor from dual) T;

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar