2011-12-20 4 views
1

У меня есть длинный запрос sql, который вычисляет несколько вещей о платежах и отгрузках. В некоторых случаях значение является null. я думаю, что это потому, что есть деления на 0.mysql show 0, если выбранное значение равно null?

Вот небольшая часть моего запроса:

 ROUND(sum(case when shipping_method = 'c' AND (paid_amount - shipping_costs) < 70 then 1 end) * 100/sum(case when shipping_method = 'c' then 1 end),2) as co_less_70, 

Я думаю, что, когда эта часть 0: sum(case when shipping_method = 'colissimo' then 1 end),2) мой запрос показывает пустой , Есть ли способ присвоить значение по умолчанию для этого столбца co_less_70?

+2

ли вы пробовали 'IFNULL'? – Jomoos

ответ

4

Да. Вы можете использовать функцию COALESCE():

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce
Возвращает первое ненулевое значение в списке, или NULL, если нет ненулевых значений.

В коде:

COALESCE(
    ROUND(sum(case when shipping_method = 'c' AND (paid_amount - shipping_costs) < 70 then 1 end) * 100/sum(case when shipping_method = 'c' then 1 end),2), 
    0 
) AS co_less_70 
1

Вы можете установить вариант по умолчанию, но ничего, кроме нуля: -

sum(case when shipping_method = 'colissimo' then 1 else some_value end case),2) 
+0

Пользователь хочет присвоить значение по умолчанию для всего столбца, когда оно «NULL», а не только значение по умолчанию, когда делитель равен «0». –

+0

Если нет строк, где shipping_method = 'c', то вы получите 0/0, что, скорее всего, вызывает проблему. Это не исправит - и любое другое значение отбросит математику. – cHao

3
IFNULL(
    ROUND(sum(case when shipping_method = 'c' AND (paid_amount - shipping_costs) < 70 then 1 end) * 100/sum(case when shipping_method = 'c' then 1 end),2) 
,<default>) AS co_less_70, 
Смежные вопросы