Solved

ms sql server 2005 non zero avg query

Posted on 2011-09-06
6
503 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

When writing XML code a very difficult part is when we like to remove all the elements or attributes from the XML that have no data. I would like to share a set of recursive MSSQL stored procedures that I have made to remove those elements from …
Data architecture is an important aspect in Software as a Service (SaaS) delivery model. This article is a study on the database of a single-tenant application that could be extended to support multiple tenants. The application is web-based develope…

733 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