将表中的AVERAGE()值插入同一个表中

时间:2013-08-14 18:11:04

标签: asp.net sql sql-server

我有一个名为Test的表,其中包含名为ID,Name,UserValue,AverageValue

的列

ID,Name,UserValue,AverageValue(如表中所示)
1,A,10,NULL
2,A,20,NULL
3,B,5,NULL
4,B,10,NULL
5,C,25,NULL

我知道如何通过(SELECT Name, AVG(UserValue) FROM Test GROUP BY Name)平均数字 给我:

名称,列1(AVG(查询))(当我运行网站时,通过数据绑定显示在GridView1上)
一,15
B,7.5
C,25

我需要做的是通过将计算出的AVG()插入到AverageValue列服务器端来使表格显示为:

ID,Name,UserValue,AverageValue(如表中所示)
1,A,10,15
2,A,20,15
3,B,5,7.5
4,B,10,7.5
5,C,25,25

条件:
必须将AVG(UserValue)插入测试表AverageValue 如果创建了新条目,则会更新AverageValue以匹配AVG(UserValue)。

所以我要找的是一个类似这样的SQL命令:
INSERT INTO Test (AverageValue) VALUES (SELECT Name, AVG(UserValue) FROM Test GROUP BY Name)

我花了相当多的时间在谷歌搜索找到一个例子,但没有这样的运气。任何例子都将非常感谢。非常感谢提前。

2 个答案:

答案 0 :(得分:0)

我相信这会为你做到这一点。我经常使用merge语句!它非常适合做这样的事情。

和平 兆

use [test_01];

go

if object_id (N'tempdb..##test', N'U') is not null
    drop table ##test;

go

create table ##test (
    [id]            [int] identity(1, 1) not null,
    [name]          [nvarchar](max) not null,
    [user_value]    [int] not null,
    [average_value] [decimal](5, 2),
    constraint [pk_test_id] primary key([id])
  );

go

insert into ##test
        ([name], [user_value])
values      (N'a',10),
            (N'a',20),
            (N'b',5),
            (N'b',10),
            (N'c',25);

go

with [average_builder] as (select [name],
            avg(cast([user_value] as [decimal](5, 2))) as [average_value]
     from   ##test
     group  by [name])
merge into ##test as target
using [average_builder] as source
on target.[name] = source.[name]
when matched then
    update set target.[average_value] = source.[average_value];

go

select [id], [name], [user_value], [average_value] from ##test;

go 

答案 1 :(得分:0)

试试这个:

with toupdate as (
      select t.*, avg(uservalue) over (partition by name) as newavg
      from test t
     )
update toupdate
    set AverageValue = newavg;

CTE toupdate是一个可更新的CTE,因此您可以在更新语句中使用它,就像它是一个表一样。