2014-10-19 106 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

相关问题