我经过多年的检查。有时一个月内有一次以上的检查,有时候没有检查。但是,客户需要的报告要求我在申请报告的时间范围内每月只有一条记录。他们了解数据问题,并表示如果一个月内有多次检查,则采取最新检查。如果不是那个月的检查,请回到过去,直到找到一个并使用那个。所以数据样本如下:
(我收录了许多记录,因为我被告知我上次尝试时没有包含足够的数据)
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
总结:就像我说的那样,我愿意抛弃我试过的任何部分或全部内容。试着给每个人一个完整的图片。
我真的很赞赏任何帮助!
提前非常感谢!
答案 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的表,其中包含以下字段:
字段应该是不言自明的。为了它的价值,我在大多数mdbs中都保留了这样一个表的本地副本,用于类似于这个的情况。我用1/1/1991到12/31/2050的行填充它,但显然你可以根据需要调整它。此外,在这种情况下你不需要它,但我在我的表中添加了第五列:DaysInMo(28到31之间的数字),因为我经常发现它很有用。
答案 1 :(得分:0)
澄清一下 - 你是想每月获得一条记录?
问题是有几个月没有任何数据?
您是否可以创建一个包含过去和未来所有日期 - 月份组合的表格,并将该日期月份表格链接到您的数据集?