在SELECT语句中,SQL除以零错误

3

我刚刚接触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语句,但不确定如何应用。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - 1010
2个回答

5

您可以在以下情况下使用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

你正在用0替换null,这仍然会导致除以零错误... - Dan Field
不,如果表达式1等于0,它将返回NULL。 - Stanislovas Kalašnikovas
4
@DanField...你把NULLIF()函数和其他东西混淆了。它在遇到除零错误时返回NULL。请注意:NULLIF()是ANSI标准函数,在大多数数据库中都可用。这是我防止此类错误的首选方法。 - Gordon Linoff
啊,对于混淆感到抱歉——我误读为 IFNULL。我已将链接编辑为指向MySQL文档(也因此可以更改我的错误投票;) - Dan Field

1

尝试在此处执行这部分:

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

如果您在从表中的选择语句中使用SUMCAST,可能会发现有时会返回零(或者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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接