根据多个选择值更新表中的列

时间:2018-10-06 20:45:58

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

所以我想要

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

基本上,我有重复的行,因为“速度”列属于客户。因此,每个地方都有代表编号,材质,封面,颜色的组合,我想将代表位置从上方更新为平均值。

您可以看到它查找具有物料1,物料2,颜色2和重复编号123的每一行,对计数/总和取平均值,然后更新每一行的重复速度。

有没有办法像这样进行全表更新?

2 个答案:

答案 0 :(得分:2)

您可以使用join

update metrics m join
       (select repnumber, material, item, color, sum(m2.velocity)/count(*) as avg_velocity
        from metrics m2
        group by repnumber, material, item, color
       ) m2
       using (repnumber, material, item, color)
    set m.repvolocity = m2.avg_velocity;

我也想知道您为什么使用sum(velocity)/count(*)。我希望avg(velocity)。两者并非完全相同,只是在velocityNULL的情况下有所不同。

在大多数其他数据库中,您将使用相关子查询:

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

答案 1 :(得分:-1)

使用avg()函数将是最佳选择 如果您不想使用avg(),可以使用类似的方法。

选择a。,aa.repvelocity   来自指标a        加入            (SELECT SUM(力度)/ COUNT()力度,repnumber                 来自指标b                其中b.repnumber = 397                      AND b.material = 1051                      AND b.item = 1150                      AND b.color = 99             GROUP BY b.r​​epnumber)aa        开启aa.repnumber = a.repnumber;

我刚刚使用repnumber进行分组和计算。