2017-03-21 41 views
0

我有返回SQL平均不正确

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 AVG(Rate)更换第一SELECT Rate。但不是我得到的价值是SELECT AVG(Rate)是。为什么这是这样的?当我尝试SELECT AVG(CAST(Rate AS FLOAT))时,它不考虑EXCEPT条件。我错过了什么?

回答

4

我的目标是让这3个数字的平均值,所以我只需要更换第一选择价格与SELECT AVG(率)

你应该做像下面

: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 
+0

请注意,EXCEPT删除重复项。 – jarlh

0

如果你只需要平均水平。你只需要在查询下面运行。

SELECT AVG(Rate) from t_vote 

有没有必要写另外两条线,除了它以外。我测试了上述场景,并且它在我的机器上正常工作(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 
+0

很显然有一个原因,除了在那里..并阅读代码 –

+0

后的细节请注意,EXCEPT删除重复... – jarlh

+0

不只是重复..但删除满足以下语句的数据 –

2

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

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

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

警告:如果在表中至少有3排只会工作!

也许你需要将总和乘以1.0才能得到浮点结果? (由一些dbms产品所需,但不是由其他人所需)