2016-03-02 3 views
0

У меня есть следующий запрос для получения и расчета продаж за 2 заданных периода, их фактического роста и роста их индекса.MySQL - избегайте NULL по делению на ноль

Для справочного индекса роста sales growth % + 100. Так что, если элемент вырос на 8 процентов, то индекс будет 108, так же, как если бы он контрактом 8 процентов, индекс будет 92.

Проблема возникает, когда первый сравнимый год имеет 0 продаж, и следовательно, фактическое значение роста делится на 0 и NULL возвращается для 100.

Как я могу остановить запрос от возврата NULL на деление на ноль и вернуть его 0?

Это часть приложения PHP, и, таким образом, если решение будет лучше обрабатываться на прикладном уровне, пожалуйста, предложите соответственно в любых ответах.

SELECT 
    product, 
    SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END) AS `period1`, 
    SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) AS `period2`, 
    SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) - SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END) AS `growth`, 
    (((SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) - SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END))/
    (SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END))) * 100) + 100 AS `index` 
FROM 
    productlevel_data AS a 
WHERE 
    `group` = 'Confectionery' 
     AND class = 'Confectionery' 
     AND category = 'Confectionery' 
     AND subcategory = 'Seasonal' 
     AND brand = 'brand' 
     AND destination LIKE '%' 
GROUP BY product 
+0

'WHERE sales! = 0'? – Noman

ответ

2

Использование coalesce на все выражение:

coalesce(<expression>, 0) 
2

Вы можете использовать NULLIF и COALESCE:

COALESCE(
(((SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) 
    - 
SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END)) 
/
NULLIF((SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END))) * 100),0) + 100, 0) AS `index` 

Использование NULLIF помогает избежать деления на ноль ошибки: если знаменатель равен 0, тогда все выражение оценивается до NULL. Используемый COALESCE превращает это значение NULL в 0, как и ожидалось.

Примечание: Оказывается, что, в отличие от других СУБД, как SQL Server, MySQL не выдаст ошибку в случае деления на ноль происходит, но возвращает NULL вместо. Следовательно, использование NULLIF в этом случае является избыточным.

+0

Этот ответ дает мне ошибку - * неправильный параметр count для nullif * - Там что-то отсутствует? –

+0

@AdamCopley 'NULLIF' принимает * два * аргумента: выражение' SUM' ** и ** значение '0'. –

Смежные вопросы