具有先前记录增量的MS Access更新

时间:2011-06-02 15:01:42

标签: sql ms-access sql-update record

我有一个MS Access 2007数据库,我需要为其创建更新。我想要更新的表格如下:

 CarID  WeekOf          NumDataPoints   NumWksZeroPoints
 3AA    May-14-2011     23              0
 7BB    May-14-2011     9               0

 3AA    May-21-2011     35              0
 7BB    May-21-2011     0               1

 3AA    May-28-2011     24  
 7BB    May-28-2011     0   

我正在处理5月28日至2011年5月28日的最新记录集,其要点是更新每辆车的周数没有数据点。我通过检查当前周点数来做到这一点,如果它确实有一些点,那么#WeeksZeroPoints设置为零,如果当前点数为零,那么我将前几周计数并递增1。对于我上周,我会输入

  0
  2

所以我尝试了类似

的东西
UPDATE tblCars 
SET NumWksZeroPoints = IIF(NumDataPoints<>0, 0, (SELECT MAX(NumWksZeroPoints) AS wzp 
                                                 FROM tblCars AS f 
                                                 WHERE f.CarID=tblCars.CarID AND 
                                                       f.WeekEnding=#5/21/2011#) + 1
                       )
WHERE WeekOf=#5/28/2011#;

不幸的是,这不像我想的那样有效。我认为我有这个概念和大部分的SQL,我似乎无法让它工作。这是针对MS Access的,所以我知道的其他一些技巧根本不起作用。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以(有些人可能会说)应该这样做,而不更新表格。如果您每周捕获每辆汽车的数据点数,您的查询可以使用日期数学计算汽车没有数据点的周数。如果有人在您运行更新后为汽车插入数据会怎样?您最终得到的数据不一致。

答案 1 :(得分:1)

使用您的示例数据我运行了以下

UPDATE tblcar AS c 
       INNER JOIN tblcar AS previous 
         ON c.carid = previous.carid 
SET    c.numwkszeropoints = Iif([previous].[NumWksZeroPoints] = 0, 0, 
                                   [previous].[NumWksZeroPoints] + 1) 
WHERE c.weekof =#5/28/2011 # 
         AND previous.weekof =#5/21/2011#;

之后的表格看起来像这样

CarID WeekOf     NumDataPoints NumWksZeroPoints
----- ---------- ------------- -----------------
3AA   05/14/2011 23            0
7BB   05/14/2011 9             0
3AA   05/21/2011 35            0
7BB   05/21/2011 0             1
3AA   05/28/2011 24            0
7BB   05/28/2011 0             2

基本上,查询会自我加入回到前一周,如果不是零,则将当前周更新为前一周的值+ 1。