Reputation: 1
select
x.date as date,x.df as dialfileid,x.filename,x.upload_date,
sum(x.gross) as leadsreceived,
sum(x.loaded) as leadsuploaded,
sum(x.callable) as callable,
sum(x.sales) as sales,
sum(x.contacts) as contacts,
sum(x.uncallable) as uncallable,
case when sum(x.gross) = 0 then 1 else
cast(((convert(decimal,sum(x.uncallable)) /
convert(decimal,sum(x.loaded)))*1) as numeric(20,2)) end as pen_rate,
case when sum(x.contacts) = 0 then 1 else
cast(((convert(decimal,sum(x.sales)) /
convert(decimal,sum(x.contacts)))*1) as numeric(20,2)) end AS con_rate_gross
from (
select
convert(varchar(10),df.loadts, 120) as date, df.dialfileid as df, df.filename as filename, df.loadts as upload_date,
case when di.itemseqno is not null then 1 else 0 end as gross, --gross and net are same since there's no scrubbing
case when di.laststatuscd in ('22','24') then 0 else 1 end as loaded,
case when (di.externalstatus in
('a-cb','a-ccb','a-hu','a-dmni','a-busy','eng','a-am','am','a-na','na','nr') or di.externalstatus is null) then 1 else 0 end as callable,
case when di.externalstatus in ('a-l','A-S','e-v') then 1 else 0 end as sales,
case when di.externalstatus in ('A-L','A-S','E-V','A-NI','A-DNC','A-NQ','A-NQN') then 1 else 0 end as contacts,
case when di.dialfileid != '1351' and di.externalstatus in
('a-l','A-S','e-v','a-ni','a-lb','a-dnc','cba','a-lb','a-wn','a-ss','a-pm','a-fax','fax','dis') then 1 else 0 end as uncallable
from tdialitem di, tdialfile df
where
df.dialfileid = di.dialfileid
and df.campaigncd = '422USC'
) as x
group by x.date,x.df,x.filename,x.upload_date
order by x.df DESC
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
On the df.campaigncd
, if I change the 422USC into 422CAC, there's no error message, and most of the campaigncd
has no "Divide zero error message." Please help.
Upvotes: 0
Views: 273
Reputation: 15058
You are not checking the right value for 0
. The following CASE statement should check for divide by zero errors:
case when sum(x.gross) = 0 OR convert(decimal,sum(x.loaded)) = 0 then 1 else
cast(((convert(decimal,sum(x.uncallable)) /
convert(decimal,sum(x.loaded)))*1) as numeric(20,2)) end as pen_rate,
case when sum(x.contacts) = 0 OR convert(decimal,sum(x.contacts)) = 0 then 1 else
cast(((convert(decimal,sum(x.sales)) /
convert(decimal,sum(x.contacts)))*1) as numeric(20,2)) end AS con_rate_gross
I left your previous checks for 0
since that may have some relevance somewhere else (sum(x.gross) = 0
and sum(x.contacts) = 0
). If not, then you should remove them.
Upvotes: 0
Reputation: 152566
You're checking for a zero sum in one field but then using another:
case when sum(x.gross) = 0 then 1 else
cast(((convert(decimal,sum(x.uncallable)) /
convert(decimal,sum(x.loaded)))*1) as numeric(20,2)) end as pen_rate,
So my guess is that sum(x.loaded)
is 0.
Upvotes: 1