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中多次出现!