我在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
如何调整语句,使结果看起来像第二个表?
答案 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
的平均值