如何计算每个整个名称的平均值并重复该值?

时间:2013-10-31 08:20:38

标签: mysql sql average

我在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

如何调整语句,使结果看起来像第二个表?

3 个答案:

答案 0 :(得分:4)

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

这将显示所有名称的数据。但为了计算平均值,这些名称不会一次又一次地重复。与平均值的逻辑相反,一遍又一遍地计算这些值。

<强> Fiddle

为什么不重复这些行?

考虑你有100万个名字,任何使用额外的子查询来重复AVG值都会使数据库一次又一次地计算平均值,没有充分的理由。它应该只计算每个名称一次。然后,您可以以任何方式在您的网站上显示它。

答案 1 :(得分:2)

试试这个:

SELECT Name, Val, (SELECT AVG(Val) FROM varcalc v2  WHERE v1.name=v2.name) FROM varcalc v1

答案 2 :(得分: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的平均值