2015-03-13 167 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