【问题标题】:Divide by zero error encountered, but should be excluded by CASE除以零遇到错误,但应由 CASE 排除
【发布时间】:2021-05-07 09:47:11
【问题描述】:

我有以下代码,但出现错误:

遇到除以零错误。

SELECT
CASE WHEN SUM([monthly_qty]) = 0 THEN 999 
ELSE ROUND(SUM([monthly_buy] * ([monthly_markup]+100)/100),2) * SUM([monthly_qty] / [monthly_qty]) END as [monthly_total]
FROM [xxxxx].[dbo].[quote_items] WHERE docid='10152' 

导致错误的字段是第二个 [monthly_qty],就在 CASE 语句的 END 之前。

SUM([monthly_qty] / **[monthly_qty]**) 

monthly_qty 的值为零,所以错误是有道理的,但我很困惑,因为这个字段在 CASE 语句中,所以预期的结果是 999

非常感谢任何帮助。

【问题讨论】:

  • fyi case 是一个表达式而不是一个语句。
  • 您的逻辑在case 的第一个分支中有SUM([monthly_qty]),但失败是monthly_qty 的未求和值。您需要一个 inside sum 的案例。
  • 你为什么要使用SUM([monthly_qty] / [monthly_qty])?结果是错误(如果monthly_qty 为零)或1(对于monthly_qty 的非零值)?

标签: sql sql-server tsql case divide


【解决方案1】:

我无法理解您代码中某些部分的原因:

SUM([monthly_qty] / [monthly_qty])

当 [monthly_qty] = 零时结果为错误,非零为 1。

无论如何,当“monthly_qty”为零时,您可以设置一个默认值:

IIF([monthly_qty]= 0,'YOUR_DEFAULT_VALUE', [monthly_qty] / [monthly_qty])

然后:

SUM(IIF([monthly_qty]= 0,'YOUR_DEFAULT_VALUE', [monthly_qty] / [monthly_qty]))

【讨论】:

    【解决方案2】:

    阅读MS Docs,备注下有您的案例示例。

    CASE 表达式按顺序计算其条件并停止 与满足条件的第一个条件。在一些 情况下,在 CASE 表达式之前计算表达式 接收表达式的结果作为其输入。错误 评估这些表达式是可能的。聚合表达式 出现在首先评估 CASE 表达式的 WHEN 参数中, 然后提供给 CASE 表达式。例如,以下查询 在产生 MAX 的值时产生除以零错误 总计的。这发生在评估 CASE 表达式之前。

    【讨论】:

      【解决方案3】:

      原因很简单。这段代码:

      SUM([monthly_qty]) = 0
      

      在此代码中不防止被零除:

      SUM([monthly_qty] / [monthly_qty]) 
      

      表达方式不同。

      最简单的解决方案(本质上是“标准”方法)是使用NULLIF()

      SUM([monthly_qty] / NULLIF([monthly_qty], 0)) 
      

      但是,我想知道你是否真的打算:

      SUM([monthly_qty]) / NULLIF(SUM([monthly_qty]), 0) 
      

      【讨论】:

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