2015-03-13 123 views
1

我试图制定出SQL均价一系列的数字,但只包括那些大于0使用SQL摸出一些平均水平,但不是全部,记录

例如:

Field 
4 
5 
0 
6 

SELECT Avg(Field) FROM Table; 

给出3.75。但我想它忽略0,这样平均是5

SELECT Avg(Field) FROM Table where Field > 0; 

作品,但如果我有超过100场的关系:

Field1 Field2 
4  2 
5  0 
0  3 
6  4 

SELECT Avg(Field1), Avg(Field2) FROM Table; 

使用

SELECT Avg(Field1), Avg(Field2) FROM Table where Field1 >0 and Field2>0; 

将无法​​正常工作

我该怎么做?请注意,数字可以是0到100之间的任何数字

+3

'Where Field <> 0'? – Fred 2015-03-13 17:37:51

+0

这些字段是否始终具有相同的值?我的意思是:Field1将始终是0还是5?或者它可能是0,1,2,123等? – cyadvert 2015-03-13 17:52:55

+0

否 - 数字可以是0到100之间的任何数字 – RGriffiths 2015-03-13 17:53:55

回答

1

您可以使用条件表达式:

SELECT 
    Avg(case when Field1 > 0 then Field1 end), 
    Avg(case when Field2 > 0 then Field2 end) 
FROM table 
+0

完美 - 我以前没有遇到过。非常感谢你。 – RGriffiths 2015-03-13 18:07:12

3

只需使用where子句过滤掉0即可。

SELECT Avg(Field) FROM Table Where Field > 0 
+0

谢谢 - 您能否看到补充内容。我试图保持简单的问题。 – RGriffiths 2015-03-13 17:52:30

+0

@RichardGriffiths jpw击败了我! :) – Fred 2015-03-13 17:59:34

0
SELECT Avg(Field) FROM yourtable where Field > 0 ; 
+0

谢谢 - 你能看到补充。我试图保持简单的问题。 – RGriffiths 2015-03-13 17:52:49

0

转换的0至零是这样的:

SELECT AVG(IF(N=0,NULL,N)) FROM 
(
SELECT 5 N 
UNION ALL SELECT 4 
UNION ALL SELECT 0 
UNION ALL SELECT 2 

) the_ns 
+0

这可以工作,但我试图保持简单的问题。他们不只是5秒。 – RGriffiths 2015-03-13 17:53:29

0

你将不得不假AVG() :) :): )

SELECT SUM(Field1)/SUM(IF(field1>0, 1, 0)), SUM(Field2)/SUM(IF(field2>0, 1, 0)) 

我假设查询中有GROUP BY