Ms access 在MS Access中合并类似日期

Ms access 在MS Access中合并类似日期,ms-access,vba,date,merge,rows,Ms Access,Vba,Date,Merge,Rows,我是一名飞行员,一天能飞多条腿。我用来记录航班的软件会弹出一个csv文件,并单独列出每条航段。我在ms access中将csv文件导入表1。我想将同一天的所有航班合并到新表上的一个记录中。我的问题是组合路线和添加时间 表1 Date Plane From To Time 2009-10-13 111WS CHO LGA 120 2009-10-13 111WS LGA ITH 100 2009-

我是一名飞行员,一天能飞多条腿。我用来记录航班的软件会弹出一个csv文件,并单独列出每条航段。我在ms access中将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条/
一天内可以有一到八个航班/

创建一个总计查询,输入表格,并将日期和时间列为列。在总计行中,日期列应设置为
Group By
,时间列应设置为
Sum
。您还需要另一列来获取路由中的最终条目,因此也将
列放入网格中,并将该列的总计行设置为
最后一个

要获得路由的其余部分,您需要使用如下组合函数:

返回子记录值的串联列表

这将把FROM列合并为一个值,您可以将其作为另一列包含在输出中。将此列的总行设置为
Expression

要获得完整的路由,请将连接的FROM列与LAST To列合并

请注意,您不需要一次构建整个查询。分别(在其自己的查询中)构建三个部分(总时间、连接路线、结束目的地)中的每一个,并确保在将它们组合成单个查询之前,每个部分都可以单独工作。

添加模块

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
与ACE(Access 2007)不同,Jet 3.51引擎(Access97)没有多值类型。SQL该语言(包括Access数据库引擎自己的专有SQL)没有“连接”函数,因为它违反了需要标量类型的第一范式(1NF)。所以这不是SQL查询的问题。听起来更像是一份报告的候选人


说到1NF,考虑到一天内有可能飞到同一个目的地两次,您的表缺少一个关系键。听起来您需要将键入为“文本”的单个“日期”列替换为一对表示句点的
DATETIME
值,并使用所需的“顺序主键”,例如
CHECK
约束,以防止句点重叠。时态数据库绝对不平凡

谢谢您的回复。我使用了“THEn’s”的答案,但我不得不改变一些事情(希望这不是问题)。我只需要按日期分组的航班,所以我按飞机分组,只需记录当天第一站的第一架飞机。另外,我刚刚发现我的软件以相反的顺序导出csv文件,所以我对模块做了一些更改以说明这一点。这就是导入的数据的样子(我以CHO开始和结束):

这是模块:

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”时,它起作用了,但随后我遇到了数据顺序相反的问题。因此,我一直在寻找任何建议,但我希望保持字段名称不变,如果可能的话,我希望表的顺序相反。再次感谢各位。

+1--清晰的演示文稿;让我看到数据,而不是过于简化的摘要;给出了版本号。我看对了。但我会发现很难如此清楚、简洁地给出这些指示。给人印象深刻的我想你的答案将是CHO-LGA-ITH-LGA,而不是最终目的地。您需要将SELECT中的最后一个(to)与函数的结果连接起来,即conactfield(…)&“-”和最后一个(to)。它显示所有路由。首先,我初始化ConcatField=DLookup(“From”,“RTE”,其中)感谢代码,它工作得非常好。但我遇到了一些问题,不知道你是否有什么想法可以帮助我。我必须回答我自己的问题,这样我才能向每个人展示我正在使用的代码,所以我的新问题在这一页的底部。谢谢你抽出时间。
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;