1

我正在使用 DB2 SQL。我有一个表名ITEMATRIX,它看起来像 -

ITNBR   LBRCST  MFGOH   STDUC   YRMNT
RM-013         0    0   499.6   2010-02
H-178          0    0   164.5   2010-02
FP9-003        0    0   6       2010-02
FP9-059        0    0   2       2010-02
A94-103B-M     0    0   0       2010-02
140-07-1012C   0    0   10      2010-05
140-07-1012C   0    0   0       2010-06

然后

 ITNBR  LBRCST  MFGOH   STDUC   YRMNT
 140-07-1012C   0   0   10      2010-05
 140-07-1012C   0   0   **10**      2010-06

等等等等……

STDUC如果值为 0 或 Null,我想将字段更新为最近月份的值。假设 forItNBR 140-07-1012C是for ,STDUC那么首先我必须找出该项目编号在 2010 年是否有任何月份的标准成本,如果是,则复制上个月的值。有许多具有相同项目编号的记录,我稍后将对其进行转置。谁能给我一些关于如何解决这个问题的想法?02010-052010-04

谢谢瓦伦

4

3 回答 3

0

我认为他遵循的是您想要的逻辑:

update itematrix
    set stduc = (select stduc
                 from itematrix im2
                 where im2.stduc <> 0 and im2.stduc is not null and im2.itnbr = itematrix.itnbr
                 order by yrmnt desc
                 fetch first 1 row only
                )
    where stduc is null or stduc = 0

我还没有在 DB2 中测试过这个。fetch first在与更新中使用的表相同的表上使用可能会出现问题。我发现文档模棱两可。

如果您不需要实际更新,而只想查看值,请尝试:

select itemmatrix.*,
       (select stduc
        from itematrix im2
        where im2.stduc <> 0 and im2.stduc is not null and im2.itnbr = itematrix.itnbr
        order by yrmnt desc
        fetch first 1 row only
       )
from itemmatrix
于 2013-02-20T15:37:42.817 回答
0

如果使用 DB2 9.7,您可以使用 LAG() 函数:https ://www.ibm.com/developerworks/mydeveloperworks/blogs/dbtrue/entry/lag_lead_first_value_last_value_totally_new_in_db21?lang=en

于 2013-02-20T16:08:05.227 回答
0

我将流程转移到 EXCEL 并且可以轻松地使用IFVLOOKUP从最早的月份开始使用单个成本值,然后简单地比较上个月的值并相应地更改,然后UPDATE使用创建语句&。我将流程转移到 EXCEL 并且可以做到轻松使用IFVLOOKUP然后UPDATE使用&.

于 2013-02-28T13:34:48.187 回答