访问查询以使用上一期间的值添加缺失的行

时间:2010-05-28 13:47:06

标签: ms-access

我经过多年的检查。有时一个月内有一次以上的检查,有时候没有检查。但是,客户需要的报告要求我在申请报告的时间范围内每月只有一条记录。他们了解数据问题,并表示如果一个月内有多次检查,则采取最新检查。如果不是那个月的检查,请回到过去,直到找到一个并使用那个。所以数据样本如下:

(我收录了许多记录,因为我被告知我上次尝试时没有包含足够的数据)

equip_id  month  year  runtime  date
1         5      2008  400      5/10/2008 12:34 PM
1         7      2008  500      7/12/2008 1:45 PM
1         8      2008  600      8/20/2008 1:12 PM
1         8      2008  605      8/30/2008 8:00 AM
1         1      2010  2000     1/12/2010 2:00 PM
1         3      2010  2200     3/24/2010 10:00 AM
2         7      2009  1000     7/20/2009 8:00 AM
2         10     2009  1400     10/14/2009 9:00 AM
2         1      2010  1600     1/15/2010 1:00 PM
2         1      2010  1610     1/30/2010 4:00 PM
2         3      2010  1800     3/15/2010 1:00PM

After all the transformations to the data are done, it should look like this:

equip_id  month  year  runtime  date
1         5      2008  400      5/10/2008 12:34 PM
1         6      2008  400      5/10/2008 12:34 PM
1         7      2008  500      7/12/2008 1:45 PM
1         8      2008  605      8/30/2008 8:00 AM
1         9      2008  605      8/30/2008 8:00 AM
1        10      2008  605      8/30/2008 8:00 AM
1        11      2008  605      8/30/2008 8:00 AM
1        12      2008  605      8/30/2008 8:00 AM
1         1      2009  605      8/30/2008 8:00 AM
1         2      2009  605      8/30/2008 8:00 AM
1         3      2009  605      8/30/2008 8:00 AM
1         4      2009  605      8/30/2008 8:00 AM
1         5      2009  605      8/30/2008 8:00 AM
1         6      2009  605      8/30/2008 8:00 AM
1         7      2009  605      8/30/2008 8:00 AM
1         8      2009  605      8/30/2008 8:00 AM
1         9      2009  605      8/30/2008 8:00 AM
1        10      2009  605      8/30/2008 8:00 AM
1        11      2009  605      8/30/2008 8:00 AM
1        12      2009  605      8/30/2008 8:00 AM
1         1      2010  2000     1/12/2010 2:00 PM
1         2      2010  2000     1/12/2010 2:00 PM
1         3      2010  2200     3/24/2010 10:00 AM
2         7      2009  1000     7/20/2009 8:00 AM
2         8      2009  1000     7/20/2009 8:00 AM
2         9      2009  1000     7/20/2009 8:00 AM
2        10      2009  1400     10/14/2009 9:00 AM
2        11      2009  1400     10/14/2009 9:00 AM
2        12      2009  1400     10/14/2009 9:00 AM
2         1      2010  1610     1/30/2010 4:00 PM
2         2      2010  1610     1/30/2010 4:00 PM
2         3      2010  1800     3/15/2010 1:00PM

我认为这是我能给出的最准确的问题。

我现在要说我尝试了什么。虽然如果其他人有更好的方法,我完全愿意抛弃我所做的事情并以不同的方式做到......

步骤1:创建一个从数据中删除重复项的查询。 IE浏览器。每个月/每年只有一个equip_id记录,保留最新记录。 (成功完成)

第2步:创建客户想要报告的日期范围的表。 (这是在运行时动态完成的)这个表有两个字段,Month和Year。因此,如果客户想要从2008年2月到2010年3月的报告,该表将如下所示:

Month Year
2     2008
3     2008
.
.
.
12    2008
1     2009
.
.
.
12    2009
1     2010
2     2010
3     2010

然后我从第1步开始使用我的查询加入此表。所以现在我每个月和每年都有他们想要报告的记录,有空(或空白)或有时为0(不知道为什么,访问是奇怪的,但有些时候它们是空的并且它们是0的总和... ...对于不可用的运行时。我并不特别喜欢这种解决方案,但如果必须的话,我会这么做。 (这也成功完成)

步骤3:填写缺少的运行时值。这个我没有成功完成。请注意,如果报告的请求范围是2008年3月至2010年3月,并且特定equip_id的最早记录是2008年6月,则为O.K.对于feb的运行时为零(或零) - 可能是2008年。

我正在使用以下查询执行此步骤:

SELECT equip_id as e_id,year,month,
(select top 1 runhours from qry_1_c_One_Record_per_Month a 
where a.equip_id = e_id order by year,month) 
FROM qry_1_c_One_Record_per_Month 
where runhours is null or runhours = 0; 
UNION 
SELECT equip_id, year, month, runhours 
FROM qry_1_c_One_Record_per_Month 
WHERE .runhours Is Not Null And runhours <> 0

但是我显然无法检查a.equip_id = e_id ...所以我无论如何都没有确保我正在查看正确的equip_id

总结:就像我说的那样,我愿意抛弃我试过的任何部分或全部内容。试着给每个人一个完整的图片。

我真的很赞赏任何帮助!

提前非常感谢!

2 个答案:

答案 0 :(得分:1)

使用以下SQL创建查询:

SELECT runhours.equip_id, First(YrMos.Mo) AS [month], First(YrMos.Yr) AS [year], 
  (SELECT TOP 1 runtime FROM runhours AS rh WHERE runhours.equip_id=rh.equip_id AND rh.date <= YrMos.MoEnd ORDER BY rh.date DESC) AS runtime, 
  (SELECT TOP 1 rh.date FROM runhours AS rh WHERE runhours.equip_id=rh.equip_id AND rh.date <= YrMos.MoEnd ORDER BY rh.date DESC) AS [date]
FROM runhours, YrMos
WHERE (((YrMos.MoStart) Between #2/1/2008# And #3/1/2010#))
GROUP BY YrMos.MoEnd, runhours.equip_id
HAVING ((((SELECT TOP 1 runtime FROM runhours AS rh WHERE runhours.equip_id=rh.equip_id AND rh.date <= YrMos.MoEnd ORDER BY rh.date DESC)) Is Not Null))
ORDER BY runhours.equip_id;

此查询需要一个名为YrMos的表,其中包含以下字段:

  • 年:数字
  • Mo:数字
  • MoStart:日期/时间
  • MoEnd:日期/时间

字段应该是不言自明的。为了它的价值,我在大多数mdbs中都保留了这样一个表的本地副本,用于类似于这个的情况。我用1/1/1991到12/31/2050的行填充它,但显然你可以根据需要调整它。此外,在这种情况下你不需要它,但我在我的表中添加了第五列:DaysInMo(28到31之间的数字),因为我经常发现它很有用。

答案 1 :(得分:0)

澄清一下 - 你是想每月获得一条记录?

问题是有几个月没有任何数据?

您是否可以创建一个包含过去和未来所有日期 - 月份组合的表格,并将该日期月份表格链接到您的数据集?