Mysql 按类别对列进行SQL平均
我试图得到一列的平均值,基于另一列。然后,我想创建一个新的列,其中每个类别的平均值。 我似乎无法理解这一点。谢谢你的帮助 这是我的桌子Mysql 按类别对列进行SQL平均,mysql,sql,Mysql,Sql,我试图得到一列的平均值,基于另一列。然后,我想创建一个新的列,其中每个类别的平均值。 我似乎无法理解这一点。谢谢你的帮助 这是我的桌子 | value | category | | 3 | a | | 4 | a | | 5 | a | | 2 | b | | 4 | b | | 3 | b | | 1
| value | category |
| 3 | a |
| 4 | a |
| 5 | a |
| 2 | b |
| 4 | b |
| 3 | b |
| 1 | c |
| 7 | c |
这就是我想要的:
| value | category | category avg |
| 3 | a | 4 |
| 4 | a | 4 |
| 5 | a | 4 |
| 2 | b | 3 |
| 4 | b | 3 |
| 3 | b | 3 |
| 1 | c | 4 |
| 7 | c | 4 |
您可以在
from
子句或select
子句中使用子查询来执行此操作。这里有一个方法:
select value, category,
(select avg(value) from table t2 where t.category = t2.category) as catgory_avg
from table t;
编辑:
如果要更新表中的值,则可以执行以下操作:
update table t join
(select category, avg(value) as avgv
from table t
group by category
) tavg
on t.category = tavg.category
t.category_avg = tavg.avgv;
根据您的注释,您似乎希望使用该值的平均值更新该表。这可以通过更新和类似的选择来完成
UPDATE table t,
( SELECT AVG(value) as avg_val, category
FROM table
GROUP BY category
) r
SET t.category_avg = r.avg_val
WHERE t.category = r.category
谢谢。我有点困惑,因为我只有一张桌子。我已经为“类别平均值”创建了一个空白列,计算应该放在哪里。这可能吗?@bdkauff以及上面的例子;-)子查询引用与主查询相同的表,但别名是t2而不是t。结果将是准确的,但效率低下,因为每行表将计算一次子量。@JoeMurray。有了
类别的索引,value
,性能应该相当不错。谢谢!那么r是什么?很抱歉,我对sql不是很熟悉。@bdkauff r是select的别名,因此您可以在集合和位置中引用它