2012-04-25 31 views
1

我在下面有下面的代碼,我試圖獲得3列的AVG。如何在AVG功能中使用別名

SELECT 
    (SUM(score) * .3) As score_a, 
    (SUM(score) * .6) As score_b, 
    (SUM(score) * .8) As score_c 

    --now I want to get the AVG of the above scores 
    AVG(score_a + score_b + score_c) As avg_score 
FROM score_table 

但這不起作用。我收到的錯誤是「無效的列名稱score_a」。 我使用SQL Server 2008

+0

對不起,其實我糾正上面我的代碼。我仍然得到同樣的錯誤。 – dido 2012-04-25 18:24:32

+0

你不能,因爲在SELECT語句完成之前,別名不會存在。你試圖做什麼更大的背景下,什麼是你的RDBMS(不同的解決方案可用)。假設'score'是一個int,你是否接受一個double/float值的結果(即 - 是否允許數學重構平均語句的寫法)? – 2012-04-25 18:25:19

+0

如何獲得單個數字的AVG?你實際上是添加了所有的分數,並在其上應用AVG? – Habib 2012-04-25 18:25:55

回答

3

AVG()是一個聚集函數,它的值從多個並給出了它們的平均值。

您正在設法通過3

我是你的具體情況,可以用代數來完成。

SELECT 
    (SUM(score) * .3)      As score_a, 
    (SUM(score) * .6)      As score_b, 
    (SUM(score) * .8)      As score_c, 
    (SUM(score) * ((0.3 + 0.6 + .8)/3.0)) As score_avg 
FROM 
    score_table 

在更廣義的情況下,你的事實,你不能引用剛在另一列定義的列限制...

SELECT 
    a + 1  AS inc_a, 
    inc_a * 2 AS this_is_invalid 
FROM 
    your_table 

你會要麼需要重複自己,或使用子查詢...

重複

SELECT 
    (SUM(score) * .3)             As score_a, 
    (SUM(score) * .6)             As score_b, 
    (SUM(score) * .8)             As score_c, 
    ((SUM(score) * .3) + (SUM(score) * .3) + (SUM(score) * .3))/3.0 As score_avg 
FROM 
    score_table 

子查詢

SELECT 
    score_a, 
    score_b, 
    score_c, 
    (score_a + score_b + score_c)/3.0 AS score_avg 
FROM 
(
    SELECT 
    (SUM(score) * .3)            As score_a, 
    (SUM(score) * .6)            As score_b, 
    (SUM(score) * .8)            As score_c 
    FROM 
    score_table 
) 
    AS data 
+0

嗯,我想我會建議在SUM(分數)*(0.3 + 0.6 + .8)'附近加上一組額外的括號,以使它更加明確。當然,考慮到浮點/雙重問題,這將不會提供相同的結果(並且如果OP希望將得分舍入到最近的點......) – 2012-04-25 18:33:41

0

你能嘗試:

SELECT 
    (SUM(score) * .3) As score_a, 
    (SUM(score) * .6) As score_b, 
    (SUM(score) * .8) As score_c, 
    AVG(score_a + score_b + score_c) As avg_score 
FROM score_table 

,看看是否適合你?

+1

是的,實際上這是我原來的(我剛剛糾正它),但它不起作用。 – dido 2012-04-25 18:25:04

0

有手動做平均的蠻力方法,但它不會像您添加列一樣進行縮放。 :)

SELECT CAST((score_a + score_b + score_c)/3 AS DECIMAL(20,2)) As avg_score, 
     score_a, 
     score_b, 
     score_c 
FROM (
    SELECT (SUM(score) * .3) As score_a, 
      (SUM(score) * .6) As score_b, 
      (SUM(score) * .8) As score_c 
    FROM score_table 
    GROUP BY userid, gameid --Whatever you're grouping by here! 
) 
+0

這不起作用。 AVG()對行而不是列進行平均。它不會出錯,但它不會給出3分的平均值。 – MatBailie 2012-04-25 18:26:04

+0

這甚至不會爲我運行(在DB2上) - 它抱怨其他列不屬於「GROUP BY」的聚合/不屬於的一部分。 – 2012-04-25 18:35:26

+0

MySQL(我假設他們正在使用它)對於GROUP BY行的要求比DB2更加寬鬆(儘管主要是DB2用戶,我有點爲自己的遺忘而感到羞愧)。 – bhamby 2012-04-25 18:37:21