【问题标题】:Error data and dividing on 0错误数据和除以 0
【发布时间】:2018-05-15 16:17:40
【问题描述】:

需要帮助来清除错误: 消息 8114,第 16 级,状态 5,第 2 行 将数据类型 varchar 转换为数值时出错。

    CASE WHEN (proj.UserText1 IS NULL OR proj.UserText1 = '') 
         THEN 0.00 
         ELSE
         CASE 
            WHEN sopHdr.SOPTYPE = 4 
            THEN (((sopHdr.DOCAMNT - inv.TaxTotal) - inv.CostTotal) * - 1) * (proj.UserText1 / 100.0) 
                ELSE ((sopHdr.DOCAMNT - inv.TaxTotal) - inv.CostTotal) * (proj.UserText1 / 100.0) 
            END 
    END AS [Accrued Commission],

    CASE WHEN (sopHdr.DOCAMNT < 0) OR (sopHdr.SOPTYPE = 4 AND sopHdr.DOCAMNT > 0) THEN 100.00 
         ELSE 
             CASE WHEN (Paid.Paid IS NULL OR Paid.Paid = 0) OR (sopHdr.DOCAMNT = 0 OR sopHdr.DOCAMNT IS NULL) THEN 0.00 
                  ELSE (Paid.Paid / sopHdr.DOCAMNT) * 100 
    END END AS [Paid %],

    CASE WHEN sopHdr.DOCAMNT < 0 THEN (sopHdr.DOCAMNT) 
         WHEN (sopHdr.SOPTYPE = 4 AND sopHdr.DOCAMNT > 0) THEN (sopHdr.DOCAMNT * - 1) 
    ELSE CASE WHEN Paid.Paid IS NULL THEN 0.00 
              ELSE Paid.Paid 
    END END AS [Amount Received],

    CASE WHEN sopHdr.SOPTYPE = 4 
         THEN (inv.TaxTotal * - 1) 
         ELSE inv.TaxTotal 
    END AS [Tax Amount],

    CASE WHEN sopHdr.SOPTYPE = 4 THEN CAST(CAST(((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal) * - 1) AS DECIMAL(13,6)) as float)
         ELSE CAST(CAST((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal)AS DECIMAL(13,6)) as float)
    END AS [Gross Profit],

    CASE WHEN sopHdr.SOPTYPE = 4 THEN (inv.CostTotal * - 1) 
         ELSE inv.CostTotal 
    END AS [Ext Cost],

    CASE WHEN (proj.UserText1 IS NULL OR proj.UserText1 = '') THEN CAST('0.00' as varchar) 
         ELSE CAST(proj.UserText1 as varchar)
    END AS [Commission %],


    CASE WHEN sopHdr.SOPTYPE = 4 THEN CAST(CAST(((sopHdr.DOCAMNT - inv.TaxTotal) * - 1) AS DECIMAL(13,6)) as float)
         ELSE CAST(CAST((sopHdr.DOCAMNT - inv.TaxTotal) AS DECIMAL(13,6)) as float)
    END AS [Net Sales],

还有错误:

消息 8134,第 16 级,状态 1,第 16 行
遇到除以零错误。

Case#9
        CASE WHEN (sopHdr.SUBTOTAL IS NULL OR sopHdr.SUBTOTAL = 0) THEN 0.00 
                ELSE 
                    CASE WHEN sopHdr.SOPTYPE = 4 THEN ((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal) /(sopHdr.SUBTOTAL) - (inv.TaxTotal)) * - 100
                    ELSE (((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal) / (sopHdr.SUBTOTAL) - (inv.TaxTotal)) * 100)
                    END 
        END AS [Sale Gross Profit %],

请指教。谢谢

【问题讨论】:

  • 尝试将(Paid.Paid IS NULL OR Paid.Paid = 0) OR (sopHdr.DOCAMNT = 0 OR sopHdr.DOCAMNT IS NULL) 更改为((Paid.Paid IS NULL) OR (Paid.Paid = 0)) OR ((sopHdr.DOCAMNT = 0) OR (sopHdr.DOCAMNT IS NULL))。我可能有优先权问题。另外,您使用的是哪个 DBMS,Oracle?
  • 谢谢。我正在使用 SQL
  • 我收到的信息仍然相同,但我认为每个案例都需要转换。
  • 看起来这个特殊情况是问题所在:CASE WHEN (proj.UserText1 IS NULL OR proj.UserText1 = '') THEN 0.00 ELSE CASE WHEN sopHdr.SOPTYPE = 4 THEN (((sopHdr.DOCAMNT - inv.TaxTotal) - inv.CostTotal) * - 1) * (proj.UserText1 / 100.0) ELSE ((sopHdr.DOCAMNT - inv.TaxTotal) - inv.CostTotal) * (proj.UserText1 / 100.0) END END AS [应计佣金],

标签: sql case zero divide


【解决方案1】:

当您除以常量时,您不会得到Divide by zero 错误,只有表字段或包含这些字段的表达式。
由于 sql 是声明性语言,即使您编写如下内容:

select a/b
from table
where b <> 0

您的数据库引擎可能会决定为每条记录计算此值并稍后过滤掉它更容易,这显然会给您这个错误。
假设你用的是sql server,我以前是这样写的:

select a/NULLIF(b, 0)
from table
where b <> 0

NULLIF() 会将零转换为空值,而不是错误,您将得到 null,(当然在上面的示例中不会有空行)

【讨论】:

  • 是的,它有效。 CASE WHEN (sopHdr.SUBTOTAL 为 NULL 或 sopHdr.SUBTOTAL = 0) THEN 0.00 ELSE CASE WHEN sopHdr.SOPTYPE = 4 THEN ((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal) / NULLIF((NULLIF(sopHdr.SUBTOTAL, 0) - NULLIF(inv.TaxTotal,0)),0)) * - 100 ELSE (((sopHdr.SUBTOTAL - inv.TaxTotal - inv.CostTotal) / NULLIF((NULLIF(sopHdr.SUBTOTAL,0) - NULLIF( inv.TaxTotal,0)),0)) * 100) END END AS [销售毛利润 %],
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多