2

以下のコードがあり、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 を使用しています

4

3 に答える 3

4

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
于 2012-04-25T18:29:41.323 に答える
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

それがあなたのために働くかどうか見てください?

于 2012-04-25T18:23:54.043 に答える
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!
)
于 2012-04-25T18:24:20.347 に答える