0

次のようなmysql DBにテーブルがあります。

Name   Val
bb     5
bb     10
kk     12
kk     8
jj     6
jj     15

各名前の平均を計算し、次のように適切な名前に合わせて結果を繰り返したいと思います。

Name  Val  Avg(Val)
bb    5     7.5
bb    10    7.5
kk    12    10
kk    8     10
jj    6     10.5
jj    15    10.5

テーブル名に「varcalc」を使用した次のようなクエリステートメントがありますが、特定の値に対してのみ機能します。

SELECT Name, Val, (SELECT AVG(Val) FROM varcalc WHERE name="bb") FROM varcalc

結果が 2 番目の表のようになるようにステートメントを調整するにはどうすればよいですか?

4

3 に答える 3

4
SELECT Name,AVG(Val) AS Avg FROM varcalc GROUP by Name

これにより、すべての名前のデータが表示されます。しかし、その平均を計算するために、それらの名前が何度も​​繰り返されることはありません。これらの値を何度も計算するのは Average のロジックに反します。

フィドル

これらの行を繰り返してはいけないのはなぜですか?

100 万の名前があるとします。追加のサブクエリを使用してAVG値を繰り返すと、データベースは正当な理由もなく何度も平均を計算します。名前ごとに一度だけ計算する必要があります。その後、任意の方法で Web サイトに表示できます。

于 2013-10-31T08:22:13.053 に答える
3

これを試して:

SELECT Name, Val, (SELECT AVG(Val) FROM varcalc v2  WHERE v1.name=v2.name) FROM varcalc v1
于 2013-10-31T08:23:26.030 に答える
1

JOINサブクエリで使用:

SELECT 
  varcalc.*, 
  avg_name.avg_val 
FROM 
  varcalc 
  LEFT JOIN 
    (SELECT AVG(Val) AS avg_val, Name FROM varcalc GROUP BY Name) AS avg_name 
    ON varcalc.Name=avg_name.Name

Name-したがって、各行で繰り返される各行の平均値が得られます

于 2013-10-31T08:24:12.237 に答える