Solved

ms sql server 2005 non zero avg query

Posted on 2011-09-06
6
501 Views
Last Modified: 2012-06-27
I have the following table named Complaints

shop  complaint1  complaint2  complaint3
1200  0                 5                 10


I am trying to write a query that will avg the non zero fields


Using the above example I would like 7.5 to be returned

is there an easy way to do this?
0
Comment
Question by:johnnyg123
6 Comments
 
LVL 28

Expert Comment

by:sammySeltzer
ID: 36491777
select avg(yourfield) from yourtable where yourfield <> 0
0
 

Author Comment

by:johnnyg123
ID: 36491830
I guess my example wasn't the greatest.  

I'm not looking to avg a single field

there are 3 different fields  (complaint1, complaint2 and complaint3) which I want to add up and get the everage of (but only if it is non zero)  If all  3 fields are 0 I want the average to be 0

if complaint1 is 2,   but complaint2 is 0 and complaint3 is 0


I am looking to get an average of 2
0
 
LVL 39

Expert Comment

by:BrandonGalderisi
ID: 36491846
you can't avg() across multiple fields like that.  You have to sum and divide by the number of non-zero values.

example:

CREATE TABLE #test (a INT,b INT,c INT)
INSERT INTO #test( a, b, c )
VALUES ( 0,5,10)
go
SELECT SUM(a+b+c) / (SUM(CASE WHEN a=0 THEN 0 ELSE 1 END + CASE WHEN b=0 THEN 0 ELSE 1 END + CASE WHEN c=0 THEN 0 ELSE 1 end)*1.0)
FROM #test t
0
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 14

Expert Comment

by:Christopher Gordon
ID: 36491848
select

cast((isnull(column1,0) + isnull(column2,0) + isnull(column3,0)) as decimal(10,2)) /
((case when isnull(column1,0) > 0 then 1 else 0 end) + (case when isnull(column2,0) > 0 then 1 else 0 end) + (case when isnull(column3,0) > 0 then 1 else 0 end))
0
 
LVL 14

Accepted Solution

by:
Christopher Gordon earned 500 total points
ID: 36495013
Another thought on my post.  If all of the columns are 0, you'll run into a divide by 0 error.  You'll need to wrap the divisor with a  NULLIF() function, which will turn the 0 to null thus preventing the error.

select

cast((isnull(column1,0) + isnull(column2,0) + isnull(column3,0)) as decimal(10,2)) /
nullif(((case when isnull(column1,0) > 0 then 1 else 0 end) + (case when isnull(column2,0) > 0 then 1 else 0 end) + (case when isnull(column3,0) > 0 then 1 else 0 end)),0)
0
 

Author Closing Comment

by:johnnyg123
ID: 36495140
Thaniks

I wrapped an isnull around the whole statement so that if all 3 values were null that it would return 0 instead of null

    ISNULL(CAST(ISNULL(SUM(ComplaintM1), 0) + ISNULL(SUM(Complaintm2), 0) + ISNULL(SUM(Complaintm3), 0) AS decimal(10, 2))
                      / NULLIF ((CASE WHEN isnull(SUM(ComplaintM1), 0) > 0 THEN 1 ELSE 0 END) + (CASE WHEN isnull(SUM(ComplaintM2), 0) > 0 THEN 1 ELSE 0 END)
                      + (CASE WHEN isnull(SUM(ComplaintM3), 0) > 0 THEN 1 ELSE 0 END), 0), 0)
0

Featured Post

The Eight Noble Truths of Backup and Recovery

How can IT departments tackle the challenges of a Big Data world? This white paper provides a roadmap to success and helps companies ensure that all their data is safe and secure, no matter if it resides on-premise with physical or virtual machines or in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

So every once in a while at work I am asked to export data from one table and insert it into another on a different server.  I hate doing this.  There's so many different tables and data types.  Some column data needs quoted and some doesn't.  What …
Introduction: When running hybrid database environments, you often need to query some data from a remote db of any type, while being connected to your MS SQL Server database. Problems start when you try to combine that with some "user input" pass…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

825 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question