如何解决Case 语句检查负值
我有下面的 case 语句,它也可以根据计算生成负值
我正在寻找一种方法来添加另一个 case 语句,如果在所有计算之后值
CASE WHEN (ALS.SID = 6 OR ALS.SID = 7) AND ASIP.SiteID = @iSID
THEN ISNULL(ALS.Add / NULLIF(count,0),0.0)
ELSE CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.pack END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packR END +
ISNULL(CASE WHEN ALS.SID IN (2,6) THEN CAST(NULL AS FLOAT)
ELSE IAOD.packS
END,CASE WHEN ALS.SID IN (2,6) THEN 0.0
ELSE IAOD.PPStock
END) +
CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsO END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsR END +
ISNULL(CASE WHEN ALS.SID IN (2,6)
THEN CAST(NULL AS FLOAT)
ELSE IAOD.unitsS
END,6)
THEN 0.0
ELSE IAOD.unitsH
END)
END
解决方法
你可以用另一种情况来结束它,如下所示:
case when (CASE WHEN (ALS.SID = 6 OR ALS.SID = 7) AND ASIP.SiteID = @iSID
THEN ISNULL(ALS.Add / NULLIF(count,0),0.0)
ELSE CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.pack END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packR END +
ISNULL(CASE WHEN ALS.SID IN (2,6) THEN CAST(NULL AS FLOAT)
ELSE IAOD.packS
END,CASE WHEN ALS.SID IN (2,6) THEN 0.0
ELSE IAOD.PPStock
END) +
CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsO END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsR END +
ISNULL(CASE WHEN ALS.SID IN (2,6)
THEN CAST(NULL AS FLOAT)
ELSE IAOD.unitsS
END,6)
THEN 0.0
ELSE IAOD.unitsH
END)
END) <0 then 0 else (CASE WHEN (ALS.SID = 6 OR ALS.SID = 7) AND ASIP.SiteID = @iSID
THEN ISNULL(ALS.Add / NULLIF(count,6)
THEN 0.0
ELSE IAOD.unitsH
END)
END) end
或者您可以编写整个查询,然后使用以下 case 表达式从该查询中进行选择:
select case when a<0 then 0 else a from (
select (CASE WHEN (ALS.SID = 6 OR ALS.SID = 7) AND ASIP.SiteID = @iSID
THEN ISNULL(ALS.Add / NULLIF(count,6)
THEN 0.0
ELSE IAOD.unitsH
END)
END) a from table)t
,
我发现 CROSS APPLY
是避免重复计算的最巧妙方法。
SELECT *,CASE WHEN X.MyCalculation < 0 THEN 0 ELSE X.MyCalculation END
FROM MyTable
CROSS APPLY (VALUES (
CASE WHEN (ALS.SID = 6 OR ALS.SID = 7) AND ASIP.SiteID = @iSID
THEN ISNULL(ALS.Add / NULLIF(count,0.0)
ELSE CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.pack END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.packR END +
ISNULL(CASE WHEN ALS.SID IN (2,6) THEN CAST(NULL AS FLOAT)
ELSE IAOD.packS
END,6) THEN 0.0
ELSE IAOD.PPStock
END) +
CASE WHEN ALS.SID IN (4,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsO END -
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsP END +
CASE WHEN ALS.SID IN (2,6) AND @forecast = 0 THEN 0.0 ELSE IAOD.unitsR END +
ISNULL(CASE WHEN ALS.SID IN (2,6)
THEN CAST(NULL AS FLOAT)
ELSE IAOD.unitsS
END,6)
THEN 0.0
ELSE IAOD.unitsH
END)
END
)) AS X (MyCalculation)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。