2014-11-06 53 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