错误数据并除以0

时间:2018-05-15 16:17:40

标签: sql case zero divide

需要帮助才能清除错误: Msg 8114,Level 16,State 5,Line 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],

错误:

  

Msg 8134,Level 16,State 1,Line 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 %],

请指教。谢谢

1 个答案:

答案 0 :(得分:0)

除以常量,只有表格字段或包含表格的表达式时,不会出现Divide by zero错误。
因为sql是声明性语言,即使你写这样的东西:

select a/b
from table
where b <> 0

你的数据库引擎可能会决定为每条记录更容易计算并稍后过滤掉,这显然会给你这个错误。
假设yoy正在使用sql server,我曾经这样写过:

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

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