2015-10-25 4 views
0

У меня есть уравнениеSQL деления на ноль не NULLIF работает

((P.RealisedConsumption/(NULLIF((PO.ActualQty * P.QuantityPO), 0)/1000000)) - 1) * 100 AS FibreScrapFactor 

Это работает для примера того, что я смотрю. Однако, если я вынимаю предложение where (поэтому у меня есть все заказы), я получаю деление на нулевую ошибку.

Если я ограничить/+1000000 до 10, которые я затем

((P.RealisedConsumption/(NULLIF((PO.ActualQty * P.QuantityPO), 0)/10)) - 1) * 100 AS FibreScrapFactor 

Это работает для всех заказов, но неверен мне нужно разделить на миллион. Как я могу заставить это работать? Благодаря!

Это также дает мне разделить на ноль

((P.RealisedConsumption/((NULLIF(PO.ActualQty, 0) * NULLIF(P.QuantityPO, 0))/1000000)) - 1) * 100 AS FibreScrapFactor 
+0

Почему было бы делить на 1 миллион бросать деление на 0 ошибку? Почему вы проверяете, является ли '10' нулевым? – Brandon

+0

Если я правильно понял проблему, вам понадобится инструкция 'CASE' для замены« 0 »за любое значение, которое вы пытаетесь заменить. Или поместите предикат в предложение WHERE, чтобы пропустить строки, где определенные столбцы являются «нулями». – Brandon

+0

Я не знаю ... я просто прочитал, что если вы получите это значение null, если на то, что вы разделили на ... это часть большого запроса, я не могу пропустить строки, где есть нулевые столбцы. – jhowe

ответ

1
CASE WHEN (PO.ActualQty * P.QuantityPO/1000000) <> 0 THEN 
    (P.RealisedConsumption/(PO.ActualQty * P.QuantityPO/1000000) - 1) * 100 
END AS FibreScrapFactor 
+0

Это работает !!! Спасибо! Я не вижу, как это отличается от использования null if? – jhowe

+0

Вы могли бы использовать 'NULLIF', но тогда вы должны поместить все выражение:' NULLIF ((PO.ActualQty * P.QuantityPO/1000000), 0) '. Но я думаю, что нотацию «CASE» легче понять. – trincot

+0

Проверьте ответ Гиорги Накэури, у него есть точка, к которой вы хотите обратиться. – trincot

2

Я считаю, что это из-типов. У вас есть вложенные операции удаления, и если тип столбцов равен int, а значения получают меньше 1000000, тогда вы получаете 0 в результате внутренней операции. При изменении в 10, очевидно, вы просто не получите 0 поскольку результат умножения больше, то 10 во внутренней операции:

Это будет сгенерировано сообщение об ошибке:

select 2/(1/10) 

Обход просто умножать внутренний результат 1.0 чтобы сделать результат числового типа:

select 2/(1 * 1.0/10) 
+0

Привет Гиорги, долгое время не говорят ... типы данных все числовые (32,16) – jhowe

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