Sql 基于多个select值更新表中的列
在我的IDE中运行一个手动示例,我根据计数和一列的总和选择一个平均值,如下所示:Sql 基于多个select值更新表中的列,sql,db2,Sql,Db2,在我的IDE中运行一个手动示例,我根据计数和一列的总和选择一个平均值,如下所示: SELECT sum(velocity)/count(*) as avg from metrics where repnumber = 397 and material = 1051 and item = 1150 and color = 99; 但是我想根据上面的选择更新列repvelocity 因此,对于每一行,我希望它选择如上所述的列,并将repvelocity设置为平均值
SELECT
sum(velocity)/count(*) as avg
from metrics
where repnumber = 397
and material = 1051
and item = 1150
and color = 99;
但是我想根据上面的选择更新列repvelocity
因此,对于每一行,我希望它选择如上所述的列,并将repvelocity设置为平均值
所以我想:
material | item | color | velocity | repnumber | repvelocity
------------------------------------------------------------------------
1 2 2 5 123 4.2
1 2 2 2 123 4.2
1 2 2 5 123 4.2
1 2 2 4 123 4.2
1 2 2 5 123 4.2
2 3 7 7 123 3.8
2 3 7 2 123 3.8
2 3 7 3 123 3.8
2 3 7 2 123 3.8
2 3 7 5 123 3.8
基本上,我有重复的行,因为“velocity”列属于客户。所以每个地方都有一个repnumber,material,cover,color的组合,我想从上面将repvelocity更新为平均值
您可以看到它查找了包含材质1、项目2、颜色2和repnumber 123的每一行,计算了计数/求和平均值,然后更新了每一行的repvelocity
有什么方法可以像这样更新整个表吗?您可以使用连接:
我还想知道为什么要使用sumvelocity/count*。我期待着avgvelocity。两者并不完全相同,但只有当速度为零时才不同
在大多数其他数据库中,您将使用相关子查询:
update metrics m
set repvolocity = (select avg(m2.velocity)
from metrics m2
where m2.repnumber = m.repnumber and m2.material = m.material and m2.item = m.item and m2.color = m.color
);
使用avg功能将是最佳选择 如果你不想使用avg,你可以这样做 选择a、aa、a 从度量a 参加 选择总和速度/计数速度、速度和数字 来自度量b 其中b.repnumber=397 b.材料=1051 b.项目=1150 b.color=99 按b.rep编号aa分组 在aa.repnumber=a.repnumber上
我刚刚用repnumber进行分组和计算。所以我可能应该用avgvelocity?@TomN。对对于数据库来说,这是一个稍微少一些的工作,更直接地显示了您的意图。这句话的语法会稍有不同吗?@gordon_linoff你能看到我下面的评论吗?
update metrics m
set repvolocity = (select avg(m2.velocity)
from metrics m2
where m2.repnumber = m.repnumber and m2.material = m.material and m2.item = m.item and m2.color = m.color
);