Ok I posted my results before I did enough testing (some times
excitement of getting it to work blinds you from the truth!)! 
ASSUMED the answer was correct because the error went away!
After checking further there is no way to trap for a division by zero
I'll put $10 bucks up for this DUH Sami!
You can get profit percentage two ways
Sales - cost = profit

Profit/sales = %
Or
(Sales/profit)^-1 = %

The IFEQ function doesn't not handle this issue well!

(ifeq(sum(monsales),0,0,((sum(monsales)-sum(moncost))/(sum(monsales))

Someone please check my logic on this!

If sum(monsales) = 0 then
Set value = 0
Else
Set Value = ((sum(monsales)-sum(moncost))/(sum(monsales))
endif

The expression ((sum(monsales)-sum(moncost))/(sum(monsales)) is
evaluated before the condition is checked! So if you have a denominator
in your formula that equals zero (through a sum) then you'll get a
Divide by Zero error!  

Is there away round this! Someone please set me straight!

The expressions within the IFEQ function should be evaluated upon
satisfaction of the condition not before!

The select statement can have monsales equal zero due to credits applied
to that customer and profit (monsales-moncost) can equal zero too (very
rare) so it doesn't matter which denominator is used or method noted
above to calculate profit percentage! You will still get an error
message some where down the line. 

Am I over reacting about this!
 
I know that you could add a column to the table to compute the profit
percentage but if you are using the sum you can not sum or avg the
precent oolumn! So this option won't work using the select? 

Which I've done in my example below!
 

Best regards,

Oma


Example

SET QUOTES=NULL 
SET QUOTES=' 
SET DELIMIT=NULL 
SET DELIMIT=',' 
SET LINEEND=NULL 
SET LINEEND='�' 
SET SEMI=NULL 
SET SEMI=';' 
SET PLUS=NULL 
SET PLUS='+' 
SET SINGLE=NULL 
SET SINGLE='_' 
SET MANY=NULL 
SET MANY='%' 
SET IDQUOTES=NULL 
SET IDQUOTES='`' 
SET CURRENCY '$' PREF 2 B 
DISCONNECT 
SET STATICDB OFF 
SET ROWLOCKS ON 
SET FASTLOCK ON 
CREATE SCHEMA AUTHOR test1 public          
CREATE TEMPORARY TABLE `test1`  +
(`custno` TEXT    (8) ,  +
 `monsales` CURRENCY ,  +
 `moncost` CURRENCY ,  +
 `monprofit`= +
 (monsales-moncost) CURRENCY ,  +
 `monprecent`= +
 (monprofit/monsales) DOUBLE   )
SET CASE OFF 
SET AUTOSKIP ON 
SET REVERSE ON 
SET BELL OFF 
SET NULL '-0- ' 
SET DATE YEAR 30
SET DATE CENTURY 19
SET DATE SEQUENCE MMDDYYYY 
SET TIME SEQUENCE HHMMSS 
SET TOLERANCE 0. 
SET ZERO ON 
LOAD `test1` 
NONUM   
'100',100.00,50.00
'100',100.00,100.00
'100',-200.00,-150.00
'120',100.00,60.00
'120',-80.00,-60.00
'130',134.00,54.00
'130',-134.00,48.00
'140',100.00,50.00
'140',150.00,45.00
END 
SET DATE FORMAT 'MM/DD/YYYY' 
SET TIME FORMAT 'HH:MM' 
SET DATE SEQUENCE MMDDYY 
SET TIME SEQUENCE HHMMSS 
COMMENT ON TABLE `test1` IS +
'Testing of Divide by Zero'

-- get divided by zero error
select custno=8 as CustNo, sum(monsales)=8 as Sales,sum(moncost)=8 as
Cost,(sum(monsales)-sum(moncost))=8 as Profit,
(ifeq(sum(monsales),0,0,((sum(monsales)-sum(moncost))/(sum(monsales))
)))=8 as Precent from test1 group by custno



 

Reply via email to