【问题标题】:Divide by Zero Error encountered in Snowflake Query在雪花查询中遇到除以零错误
【发布时间】:2021-12-01 20:57:46
【问题描述】:

我有以下雪花查询,其中我得到一个除以零的错误...你能帮我吗..

with cte1 as 
(select * from "coe.cup"
where typeofcare ='AM'
and status ='DONE'
and review ='false'
and date (assigneddate)>='2021-04-01'), cte2 as(
select cast(completed as date) completeddate ,iscode
 ,iff(iscode=1,datediff(minute,assigneddate,coded),0) codeddatetime
 ,iff(iscode=0,datediff(minute,assigneddate,qaed),0) qaeddatetime
 ,datediff(minute,assigneddate,completed) overall  from 
 (select *,iff(qaed='1900-01-01 00:00:00.0000000',1,0) iscode from cte1)a )
 select completeddate 
 ,sum(iff(iscode=1,1,0)) noofvisitbillscoded
 ,sum(iff(iscode=1,0,1)) noofvisitbillscodedandqaed
 ,count(1) totalvisitbillscompleted
 ,cast(sum(codeddatetime)/sum(iff(iscode=1,1,0)) as float)/60 averagetimeforcodedvisitbills
 ,cast(sum(qaeddatetime)/sum(iff(iscode=1,0,1)) as float)/60  averagetimeforcodedandqaedvisitbills
 ,cast(sum(overall)/count(1) as float)/60 overallaveragetime
 from cte2
 group by completeddate

【问题讨论】:

    标签: snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    我认为这是由于 /sum(iff(iscode=1,1,0)) 可能有时返回 0。

    处理被零除的一种方法是使用NULLIF

    NULLIF( <expr1> , <expr2> )
    

    如果expr1 等于expr2,则返回NULL,否则返回expr1

    因此,在您拥有的代码中,例如 sum(iff(iscode=1,1,0)),您可以将其替换为:

    NULLIF(sum(iff(iscode = 1, 1, 0)), 0)
    

    然后这应该返回NULL,而不是导致除以零。

    【讨论】:

      【解决方案2】:

      另一种选择是使用 DIV0 函数,例如:

      DIV0(sum(codeddatetime),sum(iff(iscode=1,1,0))
      

      更多信息在这里:https://docs.snowflake.com/en/sql-reference/functions/div0.html

      【讨论】:

        【解决方案3】:

        当涉及除数时,除数可以用NULLIFZERO处理:

        NULLIFZERO( )

        如果参数的计算结果为 0,则返回 NULL;否则,返回参数。

        第二个模式sum(iff(iscode=1,1,0)) 是模拟过滤后的 COUNT 的条件和。它可以进一步简化为 COUNT_IF

        COUNT_IF( )

        返回满足条件的记录数。

        总结一下:

        ,cast(sum(codeddatetime)/sum(iff(iscode=1,1,0)) as float)/60 
        
        =>
        ,SUM(codeddatetime)/NULLIFZERO(COUNT_IF(iscode=1))/60 
        
        => if iscode is boolean column then:
        ,SUM(codeddatetime)/NULLIFZERO(COUNT_IF(iscode))/60 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多