2014-10-19 152 views
2

我有一個表#time_per_bike與6549行(沒有重複出現,甚至是bikeid列有唯一的ID)。請參閱樣本 -不同的結果之間返回SUM()/總行和AVG()在SQL服務器

Sample Data

誰能告訴我爲什麼我得到兩個查詢之間不同的結果(因爲我相信他們做同樣的操作,請糾正我,如果我錯了。)?

select SUM(AVG_WAIT_TIME)/6549 from #time_per_bike 
-- Returns 69499 

select AVG(AVG_WAIT_TIME) from #time_per_bike 
-- Returns 69520 

回答

6

「除COUNT(*)函數,所有集合函數執行 空 - 消除步驟,從而使空值不在計算 最終結果包括」。 Ref:http://en.wikipedia.org/wiki/Null_(SQL)

因此,您的數據中有一些NULL

根據您希望如何處理數據中的空值,您有兩種選擇。您可以將其視爲零值,也可以完全消除這些行,以便它們不參與COUNT(*)(如AVG()一樣)。

從引用的wiki頁面:

例如,下表中,AVG(ⅰ)(平均值的i 的)會給從AVG(j)條不同的結果:

Table 
i   j 
150  150 
200  200 
250  250 
NULL  0 

這裏AVG(i)是200(150,200和250的平均值),而AVG(j)是 150(150的平均值,200,250,和0)。

A的 這個著名的副作用是,在SQL AVG(z)是不等同與SUM(Z)/ COUNT(*)

+0

你說得對@米奇。我有兩個帶NULLS的AVG_WAIT_TIME。那麼在這種情況下,哪個是正確的avg?我猜想與AVG() – 2014-10-19 23:46:20

+2

嗯,這完全取決於如何處理數據中的空值。你可以將其視爲一個零值,或者完全消除這些行(所以它們不會貢獻給COUNT(*)) – 2014-10-19 23:47:02

+0

謝謝,我會更好地用0更新這兩個空值並採取平均值。 – 2014-10-19 23:49:28

相關問題