如何根据特定字段对日期范围中的记录进行分组

时间:2013-04-08 19:45:27

标签: ms-access

我目前正在使用连续表单来显示一组数据,这些数据会产生以下格式(每行为一条记录):

1/04/13     Person1
31/03/13    Person1
30/03/13    Person1
29/03/13    Person2
28/03/13    Person1

这些记录有100条,我想将其浓缩为以下内容:

30/03/13 - 1/04/13     Person1
29/03/13               Person2
28/03/13               Person1

数据来自查询,因此可以在SQL级别进行操作,甚至可以进入表单阶段。我也很习惯使用宏或VBA来操作表单。但是,我仍然无法找到合适的方法。

我意识到这是报告的典型行为,但由于我最终希望将其作为子窗体嵌入另一种形式,因此我无法使用报告(除非我遗漏,否则无法在表单中创建子报告东西)。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

对问题的描述很好。尝试构建这样的源查询(假设字段名为MyDateMyPerson,源表格为MyTable):

Select Person, min(MyDate) as StartDate, max(MyDate) as EndDate
from MyTable
group by Person

这为您提供了3个可以放入表单的字段。

修改

既然我们已经有了更完整的图片,那么任务就变得更复杂了,但你仍然可以选择假设人与人之间的“事件”不重叠(如果他们这样做,那么我就无法想到如何创建之后的eventIDs)。如果没有EventID,您必须创建一个:

  1. 首先,您需要将数据移动到新表格,以便您可以对其进行重新排序,并为您将在步骤2中添加的事件ID添加空白字段。
    1A。将MyTable复制到新表中。添加一个名为EventID的额外字段 1B。要填充此表,请先Delete * from TmpTbl
    1C。然后是:
    Insert into TmpTbl.* from MyTable order by MyDate,MyPerson

  2. 此代码将查看您的临时表(我称之为TmpTbl)并添加事件ID。

    Sub AddEventIDs()
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset("TmpTbl")
    Dim LastPerson As String
    Dim EventID As Integer
    docmd.setwarnings false
    While rst.EOF = False
        If LastPerson <> rst.Fields("MyPerson") Then EventID = EventID + 1
        LastPerson = rst.Fields("MyPerson")
        rst.Edit
        rst.Fields("EventID") = EventID
        rst.Update
        rst.MoveNext
    Wend
    docmd.setwarnings true
    End Sub
    
  3. 在表单的On Load事件中,添加2个查询和#1和#2中的子例程。

  4. 您的最终查询将是:

    Select MyPerson, EventID, min(MyDate) as StartDate, max(MyDate) as EndDate
    from MyTable
    group by MyPerson,EventID