Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Teradata返回零除错误-如何寻址?_Sql_Teradata_Divide By Zero - Fatal编程技术网

Sql Teradata返回零除错误-如何寻址?

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语句。然而,它被零除错误所困扰。任何关于如何处理错误异常的想法都将不胜感激

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
,已修复。