2016-09-21 4 views
0

В следующем запросе используется оператор case с некоторым делением. Тем не менее, он получает зацепило за деление нулевой ошибкой. Будем очень благодарны за любые идеи о том, как обрабатывать исключение ошибки!Терадата, возвращающая Отдел по ошибке Zero - Как обратиться?

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 

ответ

3

Просто используйте 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 
+0

Это дает мне ошибку синтаксиса «ожидается что-то между„)“и„)“ – Jeremy

+0

@Jeremy: Ops, забыла', 0', фиксированы. – dnoeth

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 
    ....