2012-04-25 4 views
1

У меня следующий код ниже, и я пытаюсь получить AVG для 3 столбцов.Как использовать псевдоним в функции 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

+0

Вы не можете, потому что псевдоним не будет существовать до завершения инструкции SELECT. Каков более широкий контекст, в котором вы пытаетесь это сделать, и какова ваша RDBMS (доступны различные решения). Предполагая, что 'score' является int, вы принимаете результат как значение double/float (т. Е. Было бы допустимо математически реорганизовать способ записи среднего оператора)? –

+0

как вы получите AVG одного номера? вы на самом деле добавляете все оценки и применяете AVG? – Habib

ответ

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 

Sub Запрос

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)', чтобы сделать его более явным.Конечно, это не обязательно будет давать одинаковые результаты, учитывая проблемы с float/double (И если OP хочет, чтобы оценка округлилась до ближайшей точки ...) –

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

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

+0

Это не будет работать для меня (в DB2) - он жалуется на то, что другие столбцы не являются частью агрегата/не являются частью «GROUP BY». –

+0

MySQL (что я предполагаю, что они используют) гораздо более либерально с его требованием к строкам GROUP BY, чем DB2 (хотя, как и прежде всего пользователь DB2, мне стыдно за то, что я забыл его). – bhamby

Смежные вопросы