close ad
 
Important WebAssist Announcement
open ad
View Menu

Technical Support Forums

Free, outstanding support from WebAssist and your colleagues

rating

MySQL Query error - Divide By Zero workaround?

Thread began 4/24/2009 8:02 am by tom92909 | Last modified 6/29/2009 9:13 am by Ray Borduin | 13919 views | 8 replies |

tom92909Beta Tester

MySQL Query error - Divide By Zero workaround?

I didn't really know where to place this new thread. It's data related, so I picked DataAssist.

Anyway, I have a query for MySQL that I am trying to obtain a percentage change from one years total sales to another years total sales on each item record. Some of the records have zeros in the calculation fields, which causes a huge problem by crashing the query with a Divide by Zero error.

Query Example:

SELECT *,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,
SUM ( `TotalUnits` - `inventory.Year1qty` ) / `TotalUnits` AS Percent
FROM `inventory`
WHERE `Dept` = 'WIDGETS'
GROUP BY Item

Is there a work around for this that I just haven't figured out? I assume this is a common MySQL issue with many more folks than just myself...

Sign in to reply to this post

Ray BorduinWebAssist

SELECT *,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,

IF(`TotalUnits`=0,0,SUM ( `TotalUnits` - `inventory.Year1qty` ) / `TotalUnits`) AS Percent

FROM `inventory`
WHERE `Dept` = 'WIDGETS'
GROUP BY Item

Sign in to reply to this post
Did this help? Tips are appreciated...

tom92909Beta Tester

Error Message...
MySQL said: Documentation
#1054 - Unknown column 'TotalUnits' in 'field list'


SELECT * ,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,
IF( `TotalUnits` =0, 0, SUM( `TotalUnits` - `inventory.Year1qty` ) / `TotalUnits` ) AS Percent
FROM `inventory`
WHERE `Dept` = 'WIDGET'
GROUP BY Item
ORDER BY Brand ASC

Sign in to reply to this post

Ray BorduinWebAssist

SELECT * ,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,
IF( SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) =0, 0, SUM( SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) - `inventory.Year1qty` ) / SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) ) AS Percent
FROM `inventory`
WHERE `Dept` = 'WIDGET'
GROUP BY Item
ORDER BY Brand ASC

Sign in to reply to this post
Did this help? Tips are appreciated...

tom92909Beta Tester

Error Message...

#1111 - Invalid use of group function

Sign in to reply to this post

tom92909Beta Tester

What about something like this....

SELECT * , SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits, (
ISNULL( (
(
`Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits`
) - `Year1qty` ) / NULLIF( `Year1qty` , 0 )
)
)

With the above, I'm getting the query to pass, but I'm getting 1's for good data only and zeros for the records that had denominators as zero (which is fine), but the records that can be calculated I need the accurate calculation to show up, not just a one.

Any suggestions?

Sign in to reply to this post

Ray BorduinWebAssist

SELECT *,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,
SUM ( `TotalUnits` - `inventory.Year1qty` ) / `inventory.Year1qty` AS Percent
FROM `inventory`
WHERE `Dept` = 'WIDGETS'
GROUP BY Item

didn't you want to use `inventory.Year1qty` anyway for percent? It appears you wouldn't ever have devide by zero at that point.

Another observation... the last error you got was an error in the GROUP BY.

Does the query:


SELECT *,
SUM( `Janunits` + `Febunits` + `Marunits` + `Aprunits` + `Mayunits` + `Jununits` + `Julunits` + `Augunits` + `Sepunits` + `Octunits` + `Novunits` + `Decunits` ) AS TotalUnits,
SUM ( `TotalUnits` - `inventory.Year1qty` ) AS PercentTop, `TotalUnits` AS PercentDivide
FROM `inventory`
WHERE `Dept` = 'WIDGETS'
GROUP BY Item

return what you expect?

Sign in to reply to this post
Did this help? Tips are appreciated...

tom92909Beta Tester

I took about 2 months off on this problem, and now I'm back to try and find a solution for a work around for "divide by zero" errors. I have the following that I'm working on (same as before mostly)...

SUM( Janunits + Febunits + Marunits + Aprunits + Mayunits + Jununits + Julunits + Augunits + Sepunits + Octunits + Novunits + Decunits ) AS CurrentTotal


It is possible that some of the records might have ZERO across all of the above fields.

Then I need to subtract the difference of the CurrentTotal from the PreviousTotal (previous total from the year before).

CurrentTotal - PreviousTotal = Difference


Once I have the difference amount, I then need to take that amount and divide it by the CurrentTotal and then multiply that result by 100

(Difference / CurrentTotal)*100 = PercentageDifference


Ok, so in the example above, there are a few of the rows that appear not to have had any activity over the past year. Resulting in a fatal Divide By Zero error message. Due to accounting restrictions, I can not filter out these rows, they must remain in the result set. I'm hoping for a solution to bypass the fatal error.

Any suggestions?

Sign in to reply to this post

Ray BorduinWebAssist

Maybe try using something like:

SUM( Janunits + Febunits + Marunits + Aprunits + Mayunits + Jununits + Julunits + Augunits + Sepunits + Octunits + Novunits + Decunits ) + 0.000000001 AS CurrentTotal

and

Round((Difference / (CurrentTotal - 0.000000001))*100,2) = PercentageDifference

By adding an insignificant number to the result you can prevent ever dividing by zero without throwing off your calculation by more than would be significant after dividing.

Sign in to reply to this post
Did this help? Tips are appreciated...

Build websites with a little help from your friends

Your friends over here at WebAssist! These Dreamweaver extensions will assist you in building unlimited, custom websites.

Build websites from already-built web applications

These out-of-the-box solutions provide you proven, tested applications that can be up and running now.  Build a store, a gallery, or a web-based email solution.

Want your website pre-built and hosted?

Close Windowclose

Rate your experience or provide feedback on this page

Account or customer service questions?
Please user our contact form.

Need technical support?
Please visit support to ask a question

Content

rating

Layout

rating

Ease of use

rating

security code refresh image

We do not respond to comments submitted from this page directly, but we do read and analyze any feedback and will use it to help make your experience better in the future.

Close Windowclose

We were unable to retrieve the attached file

Close Windowclose

Attach and remove files

add attachmentAdd attachment
Close Windowclose

Enter the URL you would like to link to in your post

Close Windowclose

This is how you use right click RTF editing

Enable right click RTF editing option allows you to add html markup into your tutorial such as images, bulleted lists, files and more...

-- click to close --

Uploading file...