0

我在 mysql 数据库中有一个如下所示的表:

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

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

4

3 回答 3

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

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

小提琴

为什么不应该重复这些行?

假设您有 100 万个名称,任何使用额外的子查询来重复该AVG值都会使数据库无缘无故地一次又一次地计算平均值。它应该只计算每个名称一次。然后,您可以以任何您想要的方式将其显示在您的网站上。

于 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 回答