SQL平均不正确

时间:2017-03-21 09:56:10

标签: sql sql-server

我有以下查询返回

Rate
------
4
6
8


SELECT Rate FROM t_Vote 
EXCEPT 
SELECT MAX(Rate) FROM t_Vote 
EXCEPT 
SELECT MIN(Rate) FROM t_Vote

我的目标是获得这3个数字的平均值,因此我只需要用SELECT Rate替换第一个SELECT AVG(Rate)。但是,使用SELECT AVG(Rate)得到的值 5 不是 6 ,而是 5 。为什么这样?当我尝试SELECT AVG(CAST(Rate AS FLOAT))时,它不考虑EXCEPT条件。我错过了什么?

3 个答案:

答案 0 :(得分:4)

  

我的目标是获得这3个数字的平均值,所以我只需用SELECT AVG(速率)替换第一个SELECT速率

你应该这样做

:with cte(n)
as
(
SELECT Rate FROM t_Vote 
EXCEPT 
SELECT MAX(Rate) FROM t_Vote 
EXCEPT 
SELECT MIN(Rate) FROM t_Vote
)
select avg(n) from cte

答案 1 :(得分:2)

EXCEPT解决方案会在计算平均值之前删除重复项!

只需手动删除最大值和最小值,然后计算平均值:

select (sum(Rate) - max(Rate) - min(Rate)) / (count(Rate) - 2)
from t_Vote

警告:只有在表格中至少有3行才有效!

也许你需要将总和乘以1.0得到浮动结果? (某些dbms产品需要,但其他人不需要。)

答案 2 :(得分:0)

如果你只需要平均值。您只需要运行以下查询。

SELECT AVG(Rate) from t_vote

没有必要写其他两行有EXCEPT的行。我测试了上面的场景,它在我的机器上运行正常(SQL 2008)。现在问题可能是表中还有其他记录,您不希望包括在平均值计算中,如0,最大值或最小值。如果是这样,请确保排除这些值,如下所示。在下面的例子中,我只是排除了最大值和最小值。

Select AVG(Rate) from (
 SELECT Rate from t_vote
 EXCEPT 
 SELECT MAX(Rate) FROM t_Vote 
 EXCEPT 
 SELECT MIN(Rate) FROM t_Vote
)a