Sql 基于多个select值更新表中的列

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设置为平均值

在我的IDE中运行一个手动示例,我根据计数和一列的总和选择一个平均值,如下所示:

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
                      );