Estoy haciendo el porcentaje por la frecuencia del valor de la columna usando bigquery. Sin embargo, parte del valor puede ser cero, por lo que la consulta devolverá un error seguro

(division by zero: 0 / 0)

¿Cómo aplicar el tipo de IFERROR (x / y, nulo) en este caso? ¿Entonces la consulta rebotará un valor nulo como resultado en lugar de error?

SELECT 
    User_ID, 
   ROUND(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END) / COUNT(Name) * 100 ,1) AS Percentage_of_MIKE,
    
FROM
  table
GROUP BY 
  User_ID

INTENTÓ:

ROUND(SAFE_DIVIDE(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END) / COUNT(Name) * 100 ,1)) AS Percentage_of_MIKE,
1
swm 22 jun. 2020 a las 20:16

3 respuestas

La mejor respuesta

Solo puede usar la función SAFE_DIVIDE en tales casos

Algo como en el siguiente ejemplo

ROUND(SAFE_DIVIDE(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END), COUNT(Name) * 100) ,1) AS Percentage_of_MIKE
1
Mikhail Berlyant 22 jun. 2020 a las 17:22

Tiendo a usar NULLIF() para este propósito, porque me gusta usar el operador de división para la división:

SELECT User_ID, 
       ROUND(COUNTIF(Name LIKE '%MIKE%') * 100 / NULLIF(COUNT(Name), 0), 1) AS Percentage_of_MIKE
FROM table
GROUP BY User_ID;
1
Gordon Linoff 22 jun. 2020 a las 23:24

Este error indica que tiene User_ID s cuyos Name s son NULL. Entonces, el denominador de su división es 0 (COUNT(Name) cuenta valores que no son null de Name), y obtiene la división por error 0.

Una manera simple de evitar esto es usar AVG():

ROUND(AVG(CASE 
    WHEN Name LIKE '%MIKE%' THEN 1.0
    WHEN Name IS NOT NULL THEN 0
END) * 100, 1) AS Percentage_of_MIKE
1
GMB 22 jun. 2020 a las 17:18