2010-05-28 11 views
0

我從多年的許多個月開始檢查。有時候一個月有一次以上的檢查,有時候沒有檢查。然而,客戶所期望的報告要求我每月在他們要求報告的時間範圍內有正確的一個記錄。他們瞭解數據問題,並表示如果一個月內有多次檢查採取最新的檢查。如果不是該月的檢查,請及時返回,直到找到一個並使用該檢查。因此,數據的樣本如下:訪問查詢使用上一期的值添加缺少的行

(我在內的很多記錄,因爲有人告訴我,我並沒有包括在我的最後一次嘗試了足夠的數據)

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。因此,如果客戶想2010年3月,從2008年2月的一份報告就看看錶所示:

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

我便離開加入了這個表,從第1步我的查詢所以,現在我有每個月,每一個記錄一年,他們想要的報告,與空(或空白)或有時0(不知道爲什麼,訪問是奇怪的,但有些領域,他們是零和總結他們是0 ...)的運行時間是不可用的。我不特別喜歡這個解決方案,但是如果必須的話,我會這樣做。 (這也成功完成)

步驟3:填寫缺少的運行時值。這我沒有成功。請注意,如果報告的請求範圍是2008年2月至2010年3月,而特定equip_id的最早記錄是2008年6月,則爲O.K.在運行時爲空(或爲零)爲月 - 2008年5月

我用下面的查詢工作了這一步:

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

摘要:所以就像我說我願意扔掉任何部分,或所有我試過的東西。試圖給每個人一個完整的圖片。

我真的apreciate任何幫助!

非常感謝!

+0

如果指定日期沒有對當月進行檢查並且最早的檢查記錄晚於指定日期,該怎麼辦?例如。指定報告跨越2007年1月至2008年12月,您最早的記錄是5/2008? – code4life 2010-05-28 14:18:11

+0

這是否回答您的問題? 「請注意,如果該報告要求範圍是2008年2月至2010年3月和特定equip_id最早的記錄是說2008年6月,它是確定的運行時間爲空(或爲零)爲月 - 2008年5月」因此,對於運行時間爲1/2007到2008年4月,保持空(或者沒有記錄)是可以的。 – kralco626 2010-05-28 14:23:38

回答

0

澄清 - 你想每月獲得一個記錄?

問題是有些月份沒有任何數據?

您是否可以不創建包含過去和未來的所有日期 - 月份組合並將該日期 - 月份表格鏈接到數據集的表格?

+0

是的,我可以做到這一點。但我不明白如何使用它來解決我的問題 – kralco626 2010-05-28 14:25:29

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具有以下字段的表:

  • YR:數
  • 莫:數
  • MoStart :日期/時間
  • 時間:日期/時間

這些字段應該是不言自明的。對於它的價值,我在本文創建的大多數mdbs中保存了類似於此類表的本地副本。我使用從1/1/1991到12/31/2050的行填充它,但顯然你可以根據需要調整它。另外,在這種情況下你不需要它,但我添加了第五列:DaysInMo(數字在28和31之間)到我的表中,因爲我經常發現它很有用。