2012-04-25 8 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"입니다.

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 

을하고 당신을 위해 작동하는지 확인 : 나는 SQL 서버 2008

+0

죄송 하위 쿼리, 사실은 위의 내 코드를 수정했습니다. 나는 여전히 같은 오류가 발생합니다. – dido

+0

별명은'SELECT' 문이 완료 될 때까지 존재하지 않기 때문에 당신은 할 수 없습니다. 이 작업을 수행하려는 더 큰 컨텍스트는 무엇이며, RDBMS는 무엇입니까 (사용 가능한 다른 솔루션). 'score'가 int라고 가정하면 결과를 double/float 값으로 받아들이습니까 (즉, 평균 진술이 쓰여지는 방식을 수학적으로 리팩토링하는 것이 허용됩니까?)? –

+0

단일 번호의 AVG를 얻는 방법은 무엇입니까? 실제로 모든 점수를 추가하고 그것에 AVG를 적용하고 있습니까? – Habib

답변

3

AVG() 여러로부터 값을 취하여 평균을 준다 집합 함수이다.

평균을 시도 중입니다. 입니다.

귀하의 구체적인 경우는 대수를 사용하여 수행 할 수 있습니다. 더 일반화 된 경우

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 (score) * (0.3 + 0.6 + .8)'주위에 추가 괄호 세트를 두는 것이 좋습니다.물론, 부동 소수점/이중 문제가 주어진 경우에는 꼭 같은 결과를 제공하지 않을 것입니다. (그리고 OP가 가장 가까운 지점으로 반올림하려는 경우 ...) –

0

을 사용하고 당신은 시도 할 수 있을까요?

+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 (내가 사용하고 있다고 가정)은 DB2보다 GROUP BY 행에 대한 요구 사항이 훨씬 더 자유 롭습니다. (주로 DB2 사용자로서, 나는 그것을 잊어 버린 것에 대해 부끄럽습니다.) – bhamby

관련 문제