Sql server I';我正在编写一个TSQL过程,并有一个提取数据的查询。但是它';s返回被零除的错误异常

Sql server I';我正在编写一个TSQL过程,并有一个提取数据的查询。但是它';s返回被零除的错误异常,sql-server,tsql,isnull,Sql Server,Tsql,Isnull,尽管我在代码中使用了ISNULL,但下面代码中的除零错误异常。关于如何解决这个问题的任何建议 SELECT dd.detail_id DETAIL_ID, dd.period_id PERIOD_ID, noff.FGA_ID FGA_ID, noff.fulfillment_center FULFILLMENT_CENTER, noff.DEMAND_TYPE DEMAND_TYPE, noff.LEGACY_SSC LEGACY_SSC, noff.net_

尽管我在代码中使用了
ISNULL
,但下面代码中的除零错误异常。关于如何解决这个问题的任何建议

SELECT 
    dd.detail_id DETAIL_ID, dd.period_id PERIOD_ID, noff.FGA_ID FGA_ID,
    noff.fulfillment_center FULFILLMENT_CENTER, noff.DEMAND_TYPE DEMAND_TYPE,
    noff.LEGACY_SSC LEGACY_SSC,
    noff.net_offset_forecast NET_OFFSET_FORECAST,
    noff.forecast_to_be_consumed FORECAST_TO_BE_CONSUMED,
    CASE 
       WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 
          THEN 0 
          ELSE (noff.net_offset_forecast * dd.detail_depot_wise_forecast) / ISNULL((dd.agg_depot_wise_forecast), 0))
    END detail_forecast_consumption,
    CASE 
       WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 
          THEN 0 
          ELSE (noff.FORECAST_TO_BE_CONSUMED * dd.detail_depot_wise_forecast) / ISNULL((dd.agg_depot_wise_forecast), 0))
    END detail_forecast_sales
INTO 
    aggregate_to_detail_forecast_consumption                          
FROM 
    net_offset_forecast noff 
JOIN
    disaggregate_data dd ON noff.fga_id = dd.snop_item  
                         AND noff.fulfillment_center = dd.fulfillment_center 

SELECT 
    dd.detail_id DETAIL_ID, dd.period_id PERIOD_ID, noff.FGA_ID FGA_ID,
    noff.fulfillment_center FULFILLMENT_CENTER,
    noff.DEMAND_TYPE DEMAND_TYPE, noff.LEGACY_SSC LEGACY_SSC,
    noff.net_offset_forecast NET_OFFSET_FORECAST,
    noff.forecast_to_be_consumed FORECAST_TO_BE_CONSUMED,
    CASE 
       WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0
          THEN 0 
          ELSE (noff.net_offset_forecast * dd.detail_depot_wise_forecast) / ISNULL((dd.agg_depot_wise_forecast), 0))
    END detail_forecast_consumption,
    CASE 
       WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 
          THEN 0 
          ELSE (noff.FORECAST_TO_BE_CONSUMED * dd.detail_depot_wise_forecast) / ISNULL((dd.agg_depot_wise_forecast), 0))
    END detail_forecast_sales
INTO 
    aggregate_to_detail_forecast_consumption                          
FROM 
    net_offset_forecast noff 
JOIN
    disaggregate_data dd ON noff.fga_id = dd.snop_item  
                         AND noff.fulfillment_center = dd.fulfillment_center 

上述代码不应存在除零异常

您应检查该值,当该值为空时,不要尝试进行顶部除法。当它为空时,您将用0替换它,并导致被零除的错误。 以下是一个示例:

declare @sample table (id int identity, v1 decimal(10,2), v2 decimal(10,2) null);

insert into @sample (v1, v2) values 
(10,2),
(10,null);

--select *, v1/isnull(v2,0)
--from @sample;

select *, case when v2 is null then 0 else v1/v2 end as MyVal
from @sample;

注释部分是如何执行的,并且会出错。

您应该检查该值,当值为空时,不要尝试顶部除法。当它为空时,您将用0替换它,并导致被零除的错误。 以下是一个示例:

declare @sample table (id int identity, v1 decimal(10,2), v2 decimal(10,2) null);

insert into @sample (v1, v2) values 
(10,2),
(10,null);

--select *, v1/isnull(v2,0)
--from @sample;

select *, case when v2 is null then 0 else v1/v2 end as MyVal
from @sample;

注释部分是如何操作的,并且会出错。

您不希望
/ISNULL(dd.agg\u depot\u wise\u forecast,0)

这将返回
dd.agg\u depot\u wise\u forecast
0
,具体取决于第一个参数是否为
NULL

您想使用
NULLIF()
/NULLIF(dd.agg\u depot\u wise\u forecast,0)


这将用
NULL
替换零值,从而避免错误。

您不希望
/ISNULL(dd.agg\u depot\u wise\u forecast,0)

这将返回
dd.agg\u depot\u wise\u forecast
0
,具体取决于第一个参数是否为
NULL

您想使用
NULLIF()
/NULLIF(dd.agg\u depot\u wise\u forecast,0)


这将把零值替换为
NULL
,避免了错误。

请用下面更正的case语句替换您的case语句

变化: ISNULL(dd.agg\u depot\u-wise\u-forecast,0)->ISNULL(NULLIF(dd.agg\u depot\u-wise\u-forecast,0),1)

NULLIF()将用NULL值替换0值,因此ISNULL()将始终从第二个参数中获取1

CASE WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 THEN 0 ELSE (noff.net_offset_forecast * dd.detail_depot_wise_forecast) / ISNULL(NULLIF(dd.agg_depot_wise_forecast,0), 1)) END detail_forecast_consumption, CASE WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 THEN 0 ELSE (noff.FORECAST_TO_BE_CONSUMED * dd.detail_depot_wise_forecast) / ISNULL(NULLIF(dd.agg_depot_wise_forecast,0), 1)) END detail_forecast_sales

请将您的案例陈述替换为以下更正的案例陈述

变化: ISNULL(dd.agg\u depot\u-wise\u-forecast,0)->ISNULL(NULLIF(dd.agg\u depot\u-wise\u-forecast,0),1)

NULLIF()将用NULL值替换0值,因此ISNULL()将始终从第二个参数中获取1

CASE WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 THEN 0 ELSE (noff.net_offset_forecast * dd.detail_depot_wise_forecast) / ISNULL(NULLIF(dd.agg_depot_wise_forecast,0), 1)) END detail_forecast_consumption, CASE WHEN ISNULL(dd.DEPOT_WISE_FORECAST, 0) = 0 THEN 0 ELSE (noff.FORECAST_TO_BE_CONSUMED * dd.detail_depot_wise_forecast) / ISNULL(NULLIF(dd.agg_depot_wise_forecast,0), 1)) END detail_forecast_sales

乍一看,似乎每当某个值为NULL时,都使用0。这不是一个dividebynull异常,而是一个dividebyzero异常。不可能除以0。请查看以下表达式:
ELSE(…*…)/ISNULL((dd.agg_depot_wise_预测),0))
-如果
dd.agg_depot_wise_预测
实际上是
NULL
??然后用
0
替换
NULL
,然后除以它!!这就是您的“被零除”异常——在SQL中多次出现!乍一看,似乎每当某个值为NULL时,都使用0。这不是一个dividebynull异常,而是一个dividebyzero异常。不可能除以0。请查看以下表达式:
ELSE(…*…)/ISNULL((dd.agg_depot_wise_预测),0))
-如果
dd.agg_depot_wise_预测
实际上是
NULL
??然后用
0
替换
NULL
,然后除以它!!这就是您的“被零除”异常——在SQL中多次出现!