Sql Teradata返回零除错误-如何寻址?
下面的查询使用带有一些除法的case语句。然而,它被零除错误所困扰。任何关于如何处理错误异常的想法都将不胜感激Sql Teradata返回零除错误-如何寻址?,sql,teradata,divide-by-zero,Sql,Teradata,Divide By Zero,下面的查询使用带有一些除法的case语句。然而,它被零除错误所困扰。任何关于如何处理错误异常的想法都将不胜感激 CASE WHEN Channel = 'DA' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID) WHEN Channel = 'SS' THEN CAST (CASE_QTY AS DECIMAL(
CASE
WHEN Channel = 'DA' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
WHEN Channel = 'SS' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
WHEN Channel = 'XDOCK' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
WHEN Channel = '?' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
ELSE 0
END AS Percentage
你可以用另一个箱子检查一下
CASE WHEN SUM(CAST(CASE_QTY AS DECIMAL(38,2)) <> 0 THEN
WHEN Channel = 'DA' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
THEN -1 /* or the value you prefer for zero value */
END
....
CASE WHEN SUM(CAST_数量为十进制(38,2))0然后
当通道='DA'时,则在(按ld.LOAD\U ID分区)上进行转换(以十进制(38,0)表示大小写数量)/求和(以十进制(38,2)表示大小写数量)
然后是-1/*或您喜欢的零值*/
结束
....
您可以使用另一个案例进行检查
CASE WHEN SUM(CAST(CASE_QTY AS DECIMAL(38,2)) <> 0 THEN
WHEN Channel = 'DA' THEN CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
THEN -1 /* or the value you prefer for zero value */
END
....
CASE WHEN SUM(CAST_数量为十进制(38,2))0然后
当通道='DA'时,则在(按ld.LOAD\U ID分区)上进行转换(以十进制(38,0)表示大小写数量)/求和(以十进制(38,2)表示大小写数量)
然后是-1/*或您喜欢的零值*/
结束
....
只需使用NULLIF
。此外,您可以将查询简化为:
CASE
WHEN Channel IN ('DA','SS','XDOCK','?')
THEN Cast(CASE_QTY AS DECIMAL(38,0))/NullIf(Sum(Cast(CASE_QTY AS DECIMAL(38,2))) Over (PARTITION BY ld.LOAD_ID),0)
ELSE 0
END AS Percentage
只需使用
NULLIF
。此外,您可以将查询简化为:
CASE
WHEN Channel IN ('DA','SS','XDOCK','?')
THEN Cast(CASE_QTY AS DECIMAL(38,0))/NullIf(Sum(Cast(CASE_QTY AS DECIMAL(38,2))) Over (PARTITION BY ld.LOAD_ID),0)
ELSE 0
END AS Percentage
这给了我一个语法错误“预期介于''和'”@Jeremy:Ops,忘记了
,0
,已修复。这给了我一个语法错误“预期介于''和'”@Jeremy:Ops,忘记了,0
,已修复。