Consulta SQL - división entre cero

Hola

Estoy realizando una consulta para un informe lotes de artículos y la vida restante que les queda, calculando un índice:

SELECT T1."ItemCode", T1."ItemName",T2."ItmsGrpNam" AS "Grupo de artículo", T1."OnHand" AS "Stock total de artículo", T0."WhsCode", T0."BatchNum", T0."Quantity" AS "Cantidad lote",T0."InDate", T0."ExpDate", 
DAYS_BETWEEN(T0."InDate",T0."ExpDate") AS "Vida útil" ,
DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate") AS "Vida útil restante",
((DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate"))/(DAYS_BETWEEN(T0."InDate",T0."ExpDate")))*100 AS "IVR"
FROM OIBT T0  INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" INNER JOIN OITB T2 ON T1."ItmsGrpCod" = T2."ItmsGrpCod" 
WHERE T0."Quantity"<>0
ORDER BY T1."ItemName",T0."BatchNum",T1."ItemCode",T0."WhsCode"

Quiero filtrar esta consulta para que se muestren solo los valores inferiores a 25 en la columna “IVR”, y para ello hago lo siguiente (englobo la consulta en otro select y filtro del campo IVR en el where):

SELECT * FROM
(SELECT T1."ItemCode", T1."ItemName",T2."ItmsGrpNam" AS "Grupo de artículo", T1."OnHand" AS "Stock total de artículo", T0."WhsCode", T0."BatchNum", T0."Quantity" AS "Cantidad lote",T0."InDate", T0."ExpDate", 
DAYS_BETWEEN(T0."InDate",T0."ExpDate") AS "Vida útil" ,
DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate") AS "Vida útil restante",
((DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate"))/(DAYS_BETWEEN(T0."InDate",T0."ExpDate")))*100 AS "IVR"
FROM OIBT T0  INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" INNER JOIN OITB T2 ON T1."ItmsGrpCod" = T2."ItmsGrpCod" 
WHERE T0."Quantity"<>0
ORDER BY T1."ItemName",T0."BatchNum",T1."ItemCode",T0."WhsCode") A
WHERE A."IVR"<25

Pero me lanza un error de que no se puede dividir por 0. Hay algunos lotes que no tienen indicada la fecha de vencimiento y por eso ese campo parece que almacena internamente un NULL en algunos casos, en lugar de un número. ¿Cómo podría hacer que en esos casos lo entienda como un 0 o un valor que no me de error al realizar ese filtro? He probado con IFNULL, NDIV0, IF, CASE, ...

Un saludo

Buenas

Al final se me ha encendido la bombilla y he conseguido realizarlo. Dejo aquí la solución que he aplicado por si alguna vez alguien se encuentra un problema similar.

No estoy seguro de si es la solución más óptima, pero al menos funciona :stuck_out_tongue:

SELECT * FROM (SELECT T1."ItemCode", T1."ItemName",T2."ItmsGrpNam" AS "Grupo de artículo", T1."OnHand" AS "Stock total de artículo", T0."WhsCode", T0."BatchNum", T0."Quantity" AS "Cantidad lote",T0."InDate", T0."ExpDate", 
DAYS_BETWEEN(T0."InDate",T0."ExpDate") AS "Vida útil" ,
DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate") AS "Vida útil restante",
CASE 
WHEN T0."ExpDate" IS NULL THEN 0
WHEN T0."InDate" IS NULL THEN 0
ELSE 
	CASE
	WHEN DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate")=0 THEN 0
	WHEN DAYS_BETWEEN(T0."InDate",T0."ExpDate")=0 THEN 0
	ELSE
		(DAYS_BETWEEN(CURRENT_DATE, T0."ExpDate")/DAYS_BETWEEN(T0."InDate",T0."ExpDate"))*100 
	END
END AS "IVR"
FROM OIBT T0  INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" INNER JOIN OITB T2 ON T1."ItmsGrpCod" = T2."ItmsGrpCod" 
WHERE T0."Quantity"<>0
ORDER BY T1."ItemName",T0."BatchNum",T1."ItemCode",T0."WhsCode") A
WHERE A."IVR"<25

Un saludo

3 Me gusta