如何在SQL Server上的表上获得3个值的平均值?

时间:2011-07-11 13:59:26

标签: sql sql-server average

我的数据库中存在以下情况:

        id:   |   second id:  |  value 
Row 1:  1     |    1          |   123
Row 2:  1     |    2          |   234
Row 3:  1     |    3          |   456
Row 4:  2     |    1          |   987
Row 5:  2     |    2          |   876
Row 6:  2     |    3          |   765
Row 7:  3     |    1          |   345
Row 8:  3     |    2          |   678
Row 9:  3     |    3          |   543
Row 10: 4     |    1          |   345 
...

对于每个id,我有3个秒ID,它们总是1,2和3。 我需要做的是获得这3个值的平均值(考虑id的3个值)并得到它们的平均值。我需要用一个长表(我想知道创建一个特定的视图来做这个)。

欢迎任何帮助。

(对不起,我的问题,但我真的很想在SQL Server上)

6 个答案:

答案 0 :(得分:4)

只需使用AVG并按每个ID分组。

SELECT id, AVG(value)
FROM MyTable
GROUP BY id

答案 1 :(得分:1)

如果您没有任何窗口功能,自加入也应该有效:

select id, second_id, value, avg_val_over_id
from(
    select id, second_id, value
    from table
    )a
join(
    select id, avg(value) as avg_val_over_id
    from table
    group by id
    )b
using(id);

答案 2 :(得分:0)

编辑:

根据您的评论,请尝试:

SELECT id, AVG(value)
FROM MyTable
GROUP BY id

答案 3 :(得分:0)

我不确定我是否理解你所追求的是什么,但是如果你想要每个second_id的平均值,请尝试:

SELECT second_id, AVG(value)
FROM table
GROUP BY second_id

答案 4 :(得分:0)

如果您想要准确,请使用

SELECT second_id, AVG(value*1) FROM table GROUP BY second_id 

答案 5 :(得分:0)

如果你想在你的输出中添加这些平均行,这样的东西可能会起作用(这里,我正在内联创建样本数据,并将其别名为T - 它可以轻松地从表中选择基本数据代替):

select ID,COALESCE(CONVERT(varchar(10),subid),'avg'),AVG(val) from (
select 1 as id,1 as subid,123 as val union all
select 1,2,234 union all
select 1,3,456 union all
select 2,1,987 union all
select 2,2,876 union all
select 2,3,745
) t
group by ID,subid with rollup
having ID is not null

结果:

1   1   123
1   2   234
1   3   456
1   avg 271
2   1   987
2   2   876
2   3   745
2   avg 869