在sql server中的SUM()/总行和AVG()之间返回不同的结果

Ree*_*roi 3 sql sql-server average sum sql-server-2008

我有一个表#time_per_bike,有6549行(没有重复项.即使是bikeid列也有唯一的ID).请看样品 -

样本数据

谁能告诉我为什么我在两个查询之间得到不同的结果(因为我相信他们做同样的操作.如果我错了请纠正我)?

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

select AVG(AVG_WAIT_TIME) from #time_per_bike
-- Returns 69520
Run Code Online (Sandbox Code Playgroud)

Mit*_*eat 7

"除COUNT(*)函数外,所有聚合函数都执行Null消除步骤,因此Null值不包含在计算的最终结果中." 参考:http://en.wikipedia.org/wiki/Null_(SQL)

所以你NULL的数据中有一些存在.

根据您希望如何处理数据中的空值,您有两种选择.您可以将其视为零值,也可以完全消除这些行,这样它们就不会对COUNT(*)做出贡献(如同AVG()).

来自引用的维基页面:

例如,在下表中,AVG(i)(i的平均值)将给出与AVG(j)不同的结果:

Table
i         j
150     150
200     200
250     250
NULL      0
Run Code Online (Sandbox Code Playgroud)

这里AVG(i)是200(平均150,200和250),而AVG(j)是150(150,200,250和0的平均值).

一个众所周知的副作用是在SQL中AVG(z)与SUM(z)/ COUNT(*)不等效

  • 嗯,这完全取决于您希望如何处理数据中的空值.您可以将其视为零值,也可以完全消除这些行(因此它们不会对COUNT(*)有所贡献) (2认同)