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がゼロであるため、DIVIDE BYZEROエラーが発生します。
ゼロ除算エラーを回避する方法はありますか?
その特定の月に無視される方法はありますか?
そのようなレコードを無視したい場合は、サブクエリを使用できます
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;
それらを保持し、ゼロ除算の問題を処理したい場合は、デコードまたはケースを使用できます
SELECT YEAR, period, DECODE(recd_qty, 0, NULL, round((1- sum(rej_qty) / sum(recd_qty))*100, 0))
NULLIF()
を使ってみましたか?
SELECT
( 100 / NULLIF( 0, 0 ) ) AS value
;
Oracle Doc
http://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
round(ISNULL(
((1- sum(rej_qty)) / NULLIF( (sum(recd_qty))*100), 0 )),
0
),0)
ゼロによる除算があるときにNULLIFを使用して除算を置き換えてNULLを設定すると、ISNULLを使用してNULLを0に置き換えます。つまり、必要な値に置き換えます。
CASE WHEN sum(recd_qty)<> 0 THEN round((1- sum(rej_qty)/ sum(recd_qty))* 100、0)ELSE 0 END