我有一个名为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)
我花了相当多的时间在谷歌搜索找到一个例子,但没有这样的运气。任何例子都将非常感谢。非常感谢提前。
答案 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,因此您可以在更新语句中使用它,就像它是一个表一样。