Sql “bigQuery抛出”;除零:0/0“;错误

Sql “bigQuery抛出”;除零:0/0“;错误,sql,select,group-by,count,google-bigquery,Sql,Select,Group By,Count,Google Bigquery,我正在使用bigquery按列值的频率计算百分比。但是,有些值可能为零,因此查询肯定会返回错误 (division by zero: 0 / 0) 在这种情况下,如何应用类型错误(x/y,null)?那么查询将返回空值作为结果而不是错误 SELECT User_ID, ROUND(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END) / COUNT(Name) * 100 ,1) AS Percentage_of_MIKE,

我正在使用bigquery按列值的频率计算百分比。但是,有些值可能为零,因此查询肯定会返回错误

(division by zero: 0 / 0)
在这种情况下,如何应用类型错误(x/y,null)?那么查询将返回空值作为结果而不是错误

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
尝试:

ROUND(SAFE_DIVIDE(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END) / COUNT(Name) * 100 ,1)) AS Percentage_of_MIKE,

此错误表示您有
User\u ID
s,其所有
Name
s均为
NULL
。因此,您的除法分母是
0
COUNT(Name)
计算
Name
的非
null
值),并且您通过
0
错误获得除法

避免这种情况的一种简单方法是使用
AVG()

在这种情况下,您可以只使用函数

类似于下面的示例

ROUND(SAFE_DIVIDE(SUM(CASE WHEN Name LIKE '%MIKE%' THEN 1 ELSE 0 END), COUNT(Name) * 100) ,1) AS Percentage_of_MIKE
为此,我倾向于使用
NULLIF()
,因为我喜欢使用除法运算符进行除法:

SELECT User_ID, 
       ROUND(COUNTIF(Name LIKE '%MIKE%') * 100 / NULLIF(COUNT(Name), 0), 1) AS Percentage_of_MIKE
FROM table
GROUP BY User_ID;

在帖子中添加了我已经尝试过的内容(可以参考上面)。仍然会出错。您尝试的内容(至少是更新问题中的内容)与我的答案中的内容不同-请仔细检查。但很明显,您错误地应用了SAFE_DIVIDE函数。它有两个论点。在你如何应用它的过程中,你仍然有第一个参数,它是零除的!只需复制粘贴我的示例行并替换yours@swm:欢迎。我怀疑
AVG()
比其他解决方案更有效,因为它只涉及一个聚合函数(而其他解决方案需要2个)。
SELECT User_ID, 
       ROUND(COUNTIF(Name LIKE '%MIKE%') * 100 / NULLIF(COUNT(Name), 0), 1) AS Percentage_of_MIKE
FROM table
GROUP BY User_ID;