在MS Access中合并日期

时间:2009-10-19 20:49:53

标签: ms-access vba date merge rows

我是一名飞行员,一天飞得多腿。我用来记录航班的软件吐出一个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条记录/ 一天内可以有一到八个航班/

4 个答案:

答案 0 :(得分:3)

创建一个总计查询,引入您的表格,并将DateTime列为列。日期列应在总行中设置为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”时它工作,但后来我遇到了数据顺序相反的问题。所以我正在寻找任何建议,但我想保持字段名称相同,如果可能的话我想保持表格的顺序相反。再次感谢你们。