2017-03-21 89 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產品所需,但不是由其他人所需)