0

我有一个名为 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) 给我平均数字:

Name,Column1(AVG(Query)) (当我运行网站时,通过数据绑定出现在 GridView1 上)
a,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)

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

4

2 回答 2

0

我相信这会为您解决问题。我经常使用合并语句!它非常适合做这样的事情。

和平,凯瑟琳

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 
于 2013-08-14T18:26:56.710 回答
0

尝试这个:

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

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

于 2013-08-14T18:33:29.890 回答