【问题标题】:Divide by zero error encountered when using group by使用 group by 时遇到除以零错误
【发布时间】:2019-08-23 15:45:22
【问题描述】:

我的查询中有以下代码:

CAST(COUNT(C.DateChanged) * 100.0 / COUNT(A.LastPassedBackToSalesDate) AS numeric(18, 2)) AS PBTSbutActived

这两个字段都是 DateTime 数据类型。问题是当我通过上面的代码包含 group 时会抛出这个错误:

遇到除以零错误。

警告:空值被聚合或其他 SET 消除 操作。

我在这里阅读了一些主题并尝试使用它:

CAST(COUNT(NULLIF(C.DateChanged, 0)) * 100.0 / COUNT(NULLIF(A.LastPassedBackToSalesDate, 0)) AS numeric(18, 2)) AS PBTSbutActived

但是,它没有帮助,我仍然遇到和以前一样的问题。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    NULLIF() COUNT() 之外:

    CAST(COUNT(C.DateChanged) * 100.0 /
               NULLIF(COUNT(A.LastPassedBackToSalesDate), 0) AS numeric(18, 2)
        ) AS PBTSbutActived
    

    也就是说,你需要检查COUNT()结果,而不是被统计的列。

    【讨论】:

    • 成功了!我会记住这一点。谢谢戈登,你不是第一次救我了!
    【解决方案2】:

    如果 COUNT(A.LastPassedBackToSalesDate) 为 0,则无法避免该错误。您应该在查询中添加 HAVING 子句:

    CAST(COUNT(C.DateChanged) * 100.0 /
           NULLIF(COUNT(A.LastPassedBackToSalesDate), 0) AS numeric(18, 2)
    ) AS PBTSbutActived FROM .... GROUP BY ... HAVING COUNT(A.LastPassedBackToSalesDate) <> 0
    

    【讨论】:

      【解决方案3】:

      另一种选择是使用 case 语句,

      CASE WHEN COUNT(A.LastPassedBackToSalesDate) <>0 then 
      CAST(COUNT(C.DateChanged) * 100.0 / COUNT(A.LastPassedBackToSalesDate) AS numeric(18, 2)) 
      ELSE NULL END AS PBTSbutActived
      

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多