【问题标题】:SQL Divide By Zero Error In SELECT StatementSELECT语句中的SQL除以零错误
【发布时间】:2015-06-10 13:22:16
【问题描述】:

我是 SQL 的新手,可以使用手。我的 SELECT 语句中出现除以零错误:

SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) - SUM(Cast((replace(replace(replace (p.[Total Cost], '$', ''), '(','-'),  ')','')) as money)) / SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) as new_bal

我知道我需要使用 CASE,但我不确定该应用程序。

【问题讨论】:

  • 这意味着对于某些行,您的总销售额为 0,因此在这种情况下您不能除以。您可以过滤掉这些行,或者使用 CASE 返回另一个值而不是除法。

标签: mysql sql case divide-by-zero


【解决方案1】:

您可以在以下位置使用 NULLIF

NULLIF(expression1, 0)

在你的情况下它将是:

SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) - SUM(Cast((replace(replace(replace (p.[Total Cost], '$', ''), '(','-'),  ')','')) as money)) / NULLIF(SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)),0) as new_bal

【讨论】:

  • 您在此处将 null 替换为 0,这仍会导致除以零错误...
  • 不,在这种情况下如果 expresion1 = 0 它将返回 NULL。
  • @DanField 。 . .您将 NULLIF() 函数与其他内容混淆了。它返回 NULL 而不是被零除。注意:NULLIF() 是 ANSI 标准函数,可在大多数数据库中使用。这是我防止此类错误的首选方法。
  • 啊,很抱歉造成混乱 - 我误读为 IFNULL。我已经编辑了指向 MySQL 文档的链接(也因此我可以更改我的错误投票;)
【解决方案2】:

尝试在这里做这部分:

SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money))

单独在表中的 select 语句中。您应该会发现它有时会返回零(或者可能是 NULLs)。您可以通过取出SUMCAST 来进一步调试它,以找出您可能缺少的替代品。

如果事实证明你没有遗漏任何东西(有时总和为零),那么你将如何使用 case 语句:

CASE 
  WHEN SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) != 0
  THEN SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) - SUM(Cast((replace(replace(replace (p.[Total Cost], '$', ''), '(','-'),  ')','')) as money)) / SUM(Cast((replace(replace(replace (p.[Total Sales], '$', ''), '(','-'),  ')','')) as money)) 
  ELSE 0
END as new_bal

顺便说一句,避免在列名中使用空格或其他特殊字符。我相信 MySQL 的通用标准会像 total_sales 一样平滑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多