我是一名飞行员,一天飞得多腿。我用来记录航班的软件吐出一个csv文件并分别列出每条腿。我在ms访问中将csv文件导入表1。我想将同一天的所有航班合并到一张新桌子上的一条记录中。我的问题是结合路线和增加时间。
表1
Date Plane From To Time
2009-10-13 111WS CHO LGA 120
2009-10-13 111WS LGA ITH 100
2009-10-13 111WS ITH LGA 90
2009-10-13 111WS LGA BOS 110
表2
Date Plane Route Time
2009-10-13 111WS CHO-LGA-ITH-LGA-BOS 420
我想使用VBA代码来执行此操作,但我在12年内没有做任何编程,很遗憾没有时间重新学习。我不认为代码必须过于复杂,看起来非常简单。我只是不知道该怎么做。我希望有人可以帮助我。提前谢谢。
注意: 我正在使用MS Access 97(希望这不是问题)/ 日期字段是一个字符串,而不是日期/ 时间以分钟为单位,可以保持这种状态/ 表1中通常不会有超过80条记录/ 一天内可以有一到八个航班/
答案 0 :(得分:3)
创建一个总计查询,引入您的表格,并将Date
和Time
列为列。日期列应在总行中设置为Group By
,时间应设置为Sum
。您还需要另一列来获取路径中的最终条目,因此也将To
列放在网格中,并将该列的总计行设置为Last
。
要获得路线的其余部分,您需要使用类似这样的组合功能:
返回子记录值的连锁列表
http://www.mvps.org/access/modules/mdl0004.htm
这会将FROM列合并为单个值,您可以将其作为输出中的另一列包含在内。将此列的总计行设置为Expression
。
要获得完整路线,请将连接的FROM columm与LAST TO列合并。
请注意,您无需一次构建整个查询。分别构建三个部分(总时间,连接路径,结束目的地)中的每一个(在其自己的查询中),并确保每个部分单独工作,然后将它们组合成单个查询。
答案 1 :(得分:0)
添加模块
Public Function ConcatField(FieldName As String, TableName As String, Where As String, Optional Delimeter = "-", Optional OrderBy = "") As String
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT " & FieldName & " FROM " & TableName & " WHERE " & Where & IIf(OrderBy > "", " ORDER BY " & OrderBy, ""))
ConcatField = DLookup("From", "RTE", Where)
While Not rs.EOF
ConcatField = ConcatField + IIf(ConcatField = "", "", Delimeter) + rs.Fields(0)
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Function
并运行查询
我的工作
SELECT rte.Date, rte.Plane, ConcatField("to","rte","Date='" & [Date] & "' AND Plane='" & [Plane] & "'") AS Expr1, Sum(rte.Time) AS SumOfTime
FROM rte
GROUP BY rte.Date, rte.Plane, ConcatField("to","rte","Date='" & [Date] & "' AND Plane='" & [Plane] & "'");
enter code here
答案 2 :(得分:0)
与ACE(Access 2007)不同,Jet 3.51引擎(Access97)没有多值类型。 SQL语言(包括Access数据库引擎自己的专有SQL)没有“连接”功能,因为它违反了需要标量类型的第一范式(1NF)。所以这不是SQL查询的东西。听起来更像是报告的候选人。
说到1NF,考虑到可以在一天内飞往同一目的地两次,你的桌子缺少关系密钥。听起来您需要将一个“日期”列替换为“文本”,其中一对DATETIME
值代表一个句点,并带有所需的“有序主键”,例如CHECK
约束以防止重叠期间。时态数据库绝对是不平凡的!
答案 3 :(得分:0)
感谢您的所有回复。我使用了“THEn”的答案,但我不得不改变一些事情(希望这不是问题)。我只需要按日期分组的航班,所以我按飞机取出了分组,并在当天的第一站记录了第一架飞机。另外我发现我的软件以相反的顺序导出csv文件,所以我稍微更改了模块以解决这个问题。所以这就是导入数据的样子(我在CHO中开始和结束):
Date Plane From To Time
2009-10-14 111WS LGA CHO 120
2009-10-14 111WS BOS LGA 110
2009-10-13 111WS LGA BOS 110
2009-10-13 111WS ITH LGA 90
2009-10-13 111WS LGA ITH 100
2009-10-13 111WS CHO LGA 120
这是模块:
Public Function ConcatField(FieldName As String, TableName As String, Where As String, Optional Delimeter = "-") As String
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT " & FieldName & " FROM " & TableName & " WHERE " & Where)
rs.MoveLast
While Not rs.BOF
ConcatField = ConcatField + IIf(ConcatField = "", "", Delimeter) + rs.Fields(0)
rs.MovePrevious
Wend
ConcatField = ConcatField + "-" + DLookup("To", "rte", Where)
rs.Close
Set rs = Nothing
End Function
这是查询:
SELECT rte.Date, First(rte,plane), ConcatField("From","rte","Date='" & [Date] & "'") AS Expr1, Sum(rte.time) AS [Total Time]
FROM rte
GROUP BY rte.Date;
这会导致一个问题,因为我在openrecordset行中使用了一个名为“From”的字段,我尝试将字段重命名为其他内容并且效果很好。但是我希望保持字段名称的方式。当我在openrecordset行中使用字段名称“To”时它工作,但后来我遇到了数据顺序相反的问题。所以我正在寻找任何建议,但我想保持字段名称相同,如果可能的话我想保持表格的顺序相反。再次感谢你们。