我有一個難以訪問的問題,我似乎被卡住了。我的數據如下表所示,每個人都有一個開始和結束日期以及兩者之間的天數。我試圖做的是將所有連續的作業長度加在一起,這意味着一個的結束日期是下一個作業開始日期的前一天。在我下面的例子中,我想總結記錄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複合分組和總和
3
A
回答
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
這可能是期望的結果。
這不是很漂亮,但我認爲它到達那裏。
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
相關問題
- 1. 集合和分組函數的MS Access查詢錯誤
- 2. 總和小計在MS Access按日期
- 3. MS Access相關記錄的總和
- 4. Java和MS Access
- 5. PHP和MS Access
- 6. android和ms access
- 7. DevExpress.XtraCharts.ChartControl和MS Access
- 8. ASP和MS Access
- 9. MS Access和QSqlQuery
- 10. Ms Access 2007組合框
- 11. 組合框在MS Access
- 12. MS Access如何獲得行組合的每個產品的總和?
- 13. MS Access - 綜合功能和最大
- 14. MS Access和VB.NET中
- 15. UNION JOIN和MS-ACCESS
- 16. 的MS Access和PHP
- 17. MS Access SELECT和WHERE
- 18. MS SQL分頁和分組
- 19. 分組和總分組
- 20. ms-access:分解前端和後端
- 21. 的MS Access設置快捷鍵字段和組合框
- 22. 的MS Access:組合列和行唯一的行
- 23. 如何組合和對列進行排序? MySQL,CF8,MS Access 2003
- 24. 與分組的複雜的總和
- 25. 如何分組和總和?
- 26. XSLT分組和總和
- 27. 做分組和總和SQL
- 28. DAX分組和總和
- 29. SQL分組和總和
- 30. dplyr分組和總和
+1通過練習SQL解決方案。有時他們看起來有點可怕,但作爲一個謎題,他們比啓動VBA和循環記錄集更有趣。 ;) –
最終的結果正是我所期待的,希望它能起作用,我會讓你知道的。 – user2478657
@GordThompson謝謝你的客氣話。它看起來像是可以用直接SQL來完成的,所以我想試試它。 – mikeY