Оператор SQL GROUP BY CASE для устранения ошибок - PullRequest
1 голос
/ 11 ноября 2010

Я пытаюсь написать следующую инструкцию case в моем списке SELECT:

CASE
    WHEN SUM(up.[Number_Of_Stops]) = 0 THEN 0
    ELSE SUM(up.[Total_Trip_Time] / up.[Number_Of_Stops])
END

Я продолжаю получать деление на ноль ошибок, хотя. В этом весь смысл этого случая, чтобы избежать этого. Есть другие идеи?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Вы проверяете случай, отличный от того, который вызывает ошибку. Примечание:

WHEN SUM(up.[Number_Of_Stops]) = 0

Будет истинно только тогда, когда все записи в группе имеют Number_Of_Stops = 0. Если это не так, но некоторые записи делают имеют Number_Of_Stops = 0, вы разделите на ноль.

Вместо этого попробуйте это:

SUM(CASE 
        WHEN up.[Number_Of_Stops] = 0 THEN 0 
        ELSE up.[Total_Trip_Time] / up.[Number_Of_Stops] 
    END)
3 голосов
/ 11 ноября 2010

Проверка нуля основана на SUM, агрегатной функции, что означает, что она не выполняется для каждой строки - то есть, когда происходит деление.

Вам нужно будет просмотреть предложение GROUP BY или выполнить деление (и проверку нуля) в подзапросе, прежде чем применять SUM к результату. IE:

SELECT SUM(x.result)
  FROM (SELECT CASE
                 WHEN up.[Number_Of_Stops]) > 0 THEN 
                    up.[Total_Trip_Time] / up.[Number_Of_Stops] 
                 ELSE 
                    0
               END AS result
          FROM TABLE) x
...