Как избежать ошибки DIVIDE BY ZERO в запросе SQL - PullRequest
9 голосов
/ 17 февраля 2011
SELECT  YEAR, period, round((1- sum(rej_qty) / sum(recd_qty))*100, 0)   
 FROM   TAB_A
 WHERE  sid = '200'
 AND    sdid IN ('4750')
 AND
(
       (
          YEAR ='2011'
       AND    period IN('01_JAN')
       )
OR
       (
          YEAR = '2010'
       AND    period IN('02_FEB','03_MAR','04_APR','05_MAY','06_JUN','07_JUL','08_AUG','09_SEP','10_OCT','11_NOV','12_DEC')
       )
)
group by year, period

Для определенного месяца recd_qty имеет значение ZERO, из-за которого я получаю ошибку DIVIDE BY ZERO.

Есть ли способ избежать ошибки DIVIDE BY ZERO?

I тамВ любом случае, где в этом конкретном месяце игнорируется?

Ответы [ 3 ]

20 голосов
/ 17 февраля 2011

Вы пытались использовать NULLIF()?

 SELECT
 ( 100 / NULLIF( 0, 0 ) ) AS value
 ;

Oracle Dochttp://www.oracle -base.com / Articles / 9i / ANSIISOSQLSupport.php # NULLIFFunction

Другой примерhttp://www.bennadel.com/blog/984-Using-NULLIF-To-Prevent-Divide-By-Zero-Errors-In-SQL.htm

9 голосов
/ 17 февраля 2011

Если вы хотите игнорировать такие записи, вы можете использовать подзапрос

SELECT  YEAR, period, round((1- rej_sum / recd_sum)*100, 0) FROM
(
  SELECT YEAR, sum(rej_qty) rej_sum, sum(recd_qty) recd_sum
  FROM   TAB_A
  WHERE  sid = '200'
  AND    sdid IN ('4750')
  AND
  (
       (
          YEAR ='2011'
       AND    period IN('01_JAN')
       )
  OR
  (
      YEAR = '2010'
       AND    period IN ('02_FEB','03_MAR','04_APR','05_MAY','06_JUN','07_JUL','08_AUG','09_SEP','10_OCT','11_NOV','12_DEC')
       )
  )
  group by year, period
)
WHERE recd_sum <> 0;

Если вы хотите сохранить их и обработать деление на ноль, вы можете использовать decode или case

SELECT  YEAR, period, DECODE(recd_qty, 0, NULL, round((1- sum(rej_qty) / sum(recd_qty))*100, 0)) 
3 голосов
/ 17 февраля 2011
round(ISNULL(
((1- sum(rej_qty)) / NULLIF( (sum(recd_qty))*100), 0 )),
0
),0)

Если вы заменяете свое деление, используя NULLIF, чтобы установить NULL, когда есть деление на ноль, тогда ISNULL, чтобы заменить NULL на 0 - или действительно любое значение, которое вы хотите.

...