2014-11-06 54 views
0

我想根据另一列获取列的平均值。然后,我想创建一个新的列,其平均值代表每个类别。 我似乎无法弄清楚这一点。谢谢你的帮助。按类别的SQL平均列

这里是我的表

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

回答

1

这可以使用子查询呢,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; 
+0

感谢。我有点困惑,因为我只有一张桌子。我已经创建了一个'Category Avg'的空白列,在那里进行计算。那可能吗? – bdkauff 2014-11-06 23:08:42

+0

@bdkauff上面的例子也是如此;-) – Strawberry 2014-11-07 00:37:08

+0

子查询引用与主查询相同的表,但将t2作为别名而不是t。结果将是准确的,但效率不高,因为子表将在每行计算一次。 – 2014-11-07 03:19:44

0

按您的评论,它看起来像你想要用平均值来更新表格。这可以通过更新来完成和选择,像这样

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 

FIDDLE DEMO

+0

谢谢!那么什么是r?对不起,我不熟悉sql。 – bdkauff 2014-11-06 23:20:27

+0

@bdkauff r是select的别名,所以你可以在SET和WHERE中引用它 – 2014-11-06 23:20:55