2012-04-25 50 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