Teradata 返回除以零错误 - 如何解决?
Teradata returning Division by Zero Error - How to Adress?
下面的查询使用了带有一些划分的 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(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
....
只需使用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
下面的查询使用了带有一些划分的 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(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
....
只需使用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