2017-12-05 10 views
1

値を0にするケースを追加した後でも、クエリでゼロ除算エラーが発生しています。私はそれがa.grosspcsが月の最初の0の値でもあるためかもしれないと思う。しかし、私はこの事件を最後の2時間ごとに試してみた。何か不足していますか? CTEのselectステートメントにもこのケースが必要ですか? a.grosspcsも0の場合、私は2つのケースを作っていますか?私はまだSQLに慣れていませんので、事前に助けてくれてありがとうございます。DividendとDivisorの値が0の場合、どのような場合がありますか?

SELECT datename(MM,a.MonthDate) as Month 

,Sum(a.ScrapPcs)/(Sum(a.GrossPcs)*1.00) As ScrapPct 

,0.005 As ScrapTarget 

,CASE 
WHEN Sum(a.ScrapPcs)/(Sum(a.GrossPcs)*1.00) <= 0.005 THEN 1 
WHEN Sum(a.ScrapPcs)/(Sum(a.GrossPcs)*1.00) >= 0.9*.005 THEN -1 
ELSE 0 
END 
AS Status 

,Case 
    when a.ScrapPcs=0 then null 
Else a.GrossPcs/a.ScrapPcs 
end 

FROM 
(
SELECT DATEADD(month, DATEDIFF(month, 0, b.CreationProdDate), 0) As MonthDate 
     ,Count(b.BOOKING_ID) As ScrapPcs 
     , 0 As GrossPcs 

FROM dbo.CPC_BOOKING b 

WHERE b.CreationProdDate Between DATEADD(yy, DATEDIFF(yy, 0, GetDate()), 0) AND DateAdd("d", -1, GetDate()) 
AND CPC_Level_ID = 37 

GROUP BY DATEADD(month, DATEDIFF(month, 0, b.CreationProdDate), 0) 

UNION ALL 


SELECT DATEADD(month, DATEDIFF(month, 0, n.date), 0) As MonthDate 
     ,0 As ScrapPcs 
     ,Sum(n.Processed) As GrossPcs 

FROM [NORIS].[dbo].[USC_CustomerCounts] n 

WHERE n.date Between DATEADD(yy, DATEDIFF(yy, 0, GetDate()), 0) AND DateAdd("d", -1, GetDate()) 
and n.Customer = 'SGM' 

GROUP BY DATEADD(month, DATEDIFF(month, 0, n.Date), 0) 
) a 

group by a.MonthDate,a.GrossPcs, a.ScrapPcs 

答えて

0

最初のSELECTではNULLIF()機能

SELECT 100/NULLIF(val ,0) AS foo 
--    ^^^^^^^  ^^^ 

で除数を包む、私は私が... CASE文の内、4つの除算演算

4分の1を参照してくださいの状態を評価する前に、SQL ServerがELSEの内容を評価しないという保証はないと考えてください。

, Case 
    when a.ScrapPcs=0 then null 
    Else a.GrossPcs/a.ScrapPcs 
    end 

この

, a.GrossPcs/NULLIF(a.ScrapPcs ,0) 
    --   ^^^^^^^   ^^^ 

にそうNULLIF機能は分割前に評価されることが保証される。動作の順序は保証されない場合、この、

変化。 (除算する値が知られる前に分割を行うことができない。)

また、Sum(a.GrossPcs)が今まで次いで 、ゼロであることは次のように使われているNULLIFでその発現をラップしないという保証はありません場合除数。 (または、除数全体をNULLIFにラップしてください)SELECTリストの3つの式が「ゼロで除算」することがあります。

foo/(NULLIF(SUM(a.GrossPcs) ,0)*1.00) 
     -- ^^^^^^^     ^^^ 
+0

おかげでそんなに、アイブ氏は – Student1995

+0

ノートをこれを理解しようとしている他の作業に遅れられて: 'NULLIFは(a、b)は'だけEND' – spencer7593

+0

ELSE WHEN = bがTHEN NULL 'CASEのための省略形です確かに、それは月 、合計(a.ScrapPcs)としてこの SELECT DATENAME(MM、a.MonthDate)/のようになります(NULLIF(SUM(a.GrossPcs)、0)* 1.00)として、 ScrapPct 、0.005 ScrapTarget 、CASE ように、合計(a.ScrapPcs)/(NULLIF(SUM(a.GrossPcs)、0)* 1.00)THEN <= 0.005 1 合計(a.ScrapPcs)/(NULLIF(SUM(a.GrossPcs)、0)* 1.00)> = 0.9 * 0.005 THEN -1 ELSE 0 END (a.GrossPcs/NULLIF、 ステータスAS a.ScrapPcs、0) – Student1995

関連する問題