2013-06-12 57 views
3

我有一個難以訪問的問題,我似乎被卡住了。我的數據如下表所示,每個人都有一個開始和結束日期以及兩者之間的天數。我試圖做的是將所有連續的作業長度加在一起,這意味着一個的結束日期是下一個作業開始日期的前一天。在我下面的例子中,我想總結記錄1,2,3的分配長度,並分別總結4,5,因爲在結束日期和開始日期之間有一箇中斷。它的訪問,所以我可以做一個查詢或使用vba,我不知道這裏最好的解決方案是什麼。
ID名稱的StartDate結束日期AssignmentLength
1 - 鮑勃 - 2013年1月1日 - 2013年2月1日 - 30
2 - 鮑勃 - 2013年2月2日 - 3/1/2013 - 30
3 - bob - 3/2/2013 - 2013/1/1 - 30
4 - bob - 2013年5月1日 - 2013年6月1日 - 30
5 - 鮑勃 - 2013年6月2日 - 2013年7月1日 - 30
MS Access複合分組和總和

回答

2

我增加了一個額外的記錄給定的數據:

periodID fname startdate enddate 
6   bob  8/1/2013 9/1/2013 

有一個時期,沒有跨越記錄。我給表格命名。

與修改後的數據,我們可以找到的工作週期開始:

SELECT * 
FROM workperiods 
WHERE periodid NOT IN 
    (SELECT a.periodid 
    FROM workperiods a 
    INNER JOIN workperiods b ON a.startdate =b.enddate+1); 

我們能找到的工作期間與

SELECT * 
FROM workperiods 
WHERE periodid NOT IN 
    (SELECT a.periodid 
    FROM workperiods a 
    INNER JOIN workperiods b ON a.enddate =b.startdate-1); 

結束之後,我們可以建立這個畸形:

SELECT startdate, 
     enddate, 
     enddate-startdate AS periodlength 
FROM 
    (SELECT startdate, 
      min(enddate) AS enddate 
    FROM 
    (SELECT c.startdate, 
      f.enddate 
     FROM 
     (SELECT * 
     FROM workperiods 
     WHERE periodid NOT IN 
      (SELECT a.periodid 
       FROM workperiods a 
       INNER JOIN workperiods b ON a.startdate =b.enddate+1)) AS c, 

     (SELECT * 
     FROM workperiods 
     WHERE periodid NOT IN 
      (SELECT d.periodid 
       FROM workperiods d 
       INNER JOIN workperiods e ON d.enddate =e.startdate-1)) AS f 
     WHERE f.startdate >c.enddate 
     OR c.startdate=f.startdate) 
    GROUP BY startdate) 

哪給出:

startdate enddate  periodlength 
1/1/2013 4/1/2013 90 
5/1/2013 7/1/2013 61 
8/1/2013 9/1/2013 31 

這可能是期望的結果。

這不是很漂亮,但我認爲它到達那裏。

+0

+1通過練習SQL解決方案。有時他們看起來有點可怕,但作爲一個謎題,他們比啓動VBA和循環記錄集更有趣。 ;) –

+0

最終的結果正是我所期待的,希望它能起作用,我會讓你知道的。 – user2478657

+0

@GordThompson謝謝你的客氣話。它看起來像是可以用直接SQL來完成的,所以我想試試它。 – mikeY

1

我會用VBA和DateDiff()。然後你可以遍歷每一個,並比較,看看總數是否小於1.

1

也許你可以從中得到一些想法。 AssignmentLength可以根據當月的實際長度進行修改。如果你有一些想法,請標記爲已回答。

Sub dates() 
Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim ConnStr As String 
''Dim below arrays 
Set cn = New ADODB.Connection 
ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ 
    "C:\Users\Philosophaie\Documents\a access\a Chase.mdb;" 
cn.Open ConnStr 
Set rs = New ADODB.Recordset 
rs.Open Source:="Checking", ActiveConnection:=cn, _ 
    CursorType:=adOpenKeyset, LockType:=adLockOptimistic, _ 
    Options:=adCmdTableDirect 
rs.MoveFirst 
Do Until rs.EOF 
    If rs!Name = "bob" Then 
     n=n+1 
     datestart(n)=rs!StartDate 
     dateend(n)=rs!EndDate 
     assignmentlength(n)=rs!AssignmentLength 
    End If 
    rs.MoveNext 
Loop 
for i=1 to n 
    mostart(i)=Left(datestart(i),1) 
    dystart(i)=right(left(datestart,3),1) 
    yrstart(i)=right(datestart,4) 
''do the same for end 
next I 
for i=1 to n 
    if moend(I)=mostart(i) then 
     if dyend(I)=daystart(I)+1 then 
      if yrend(I)=yrstart(I) then 
       aslen(j)=assignmentlength(I)+aslen(j) 
      else 
       j=j+1 
      end if 
     else 
       j=j+1 
     end if 
    else 
     j=j+1 
    end if 
    next I 
''output 
End sub