2

假设您在数据库中有一个表,该表每天跟踪 9 个办公地点的票务出现 4 到 5 次。在每个时间段中,人们可能会出现一张票(我想我们可以使用交易模型),或者他们可以出现很多票(我见过一些有 15 个,听说其他人有多达 50 个)。

使用 Access 2013 创建了一个查询来捕获该表中的数据。这是为了存档(当前日期表记录在 24 小时后清除)和一般分析。

当前查询逻辑如下:

SELECT Format([T1]![APP_DTE],"Short Date") AS APPEAR_DTE, 
T1.OFFICE, OFFCDES.OFFICE_NAME, OFFCDES.LOC_CDE, OFFCDES.LOC_NAME, 
T1.APP_TIME_PER, T1.ROOM_NUM, T1.INCL_CDE, T1.ID_NUMB, 
T1.ADJ_APPEAR_NUM, T2.APPEAR_CDE, 
IIf([T1]![APPEAR_LOGIN_TIME] Is Null,"",[T1]![APPEAR_LOGIN_TIME]) AS LOGIN_TIME1, 
IIf([T1]![OFFICE_LOGIN] Is Null,"",[T1]![OFFICE_LOGIN]) AS OFFICE_LOGIN, 
IIf([T1]![DECISION_TIME] Is Null,"",[T1]![DECISION_TIME]) AS DECISION_TIME, 
[T1]![ID_NUMB] & "-" & CStr([T2]![OFFICE_REP_ID]) & "-" & CStr([T1]![APP_DTE]) AS CASEKEY, 
Weekday([APP_DTE]) AS NUM_DAY, 
[T1]![OFFICE] & "-" & Weekday([T1]![APP_DTE]) & "-" & [T1]![APP_TIME_PER] AS OFFICE_TP_KEY, "" AS RecordKey
FROM (T1 INNER JOIN OFFCDES ON T1.OFFICE = OFFCDES.OFFICE) 
INNER JOIN T2 ON T1.APPEAR_NUM = T2.APPEAR_NUM
WHERE (((Format([T1]![APP_DTE],"Short Date"))=Format(Date(),"Short Date")));

我意识到上面的代码需要清理以提高可读性,而且它可能没有它应该有的效率。那部分我不能归功于我,我从一位同事那里继承了所有这些,并且刚刚开始思考它。

查询结果包含大量信息,其中一些(大部分)与我要完成的任务无关。捕获所有这些信息很重要,因为信息一旦消失就消失了。声明:

我正在尝试做的事情:

我正在尝试合并一个键/按顺序编号的列,该列将告诉我在提取日期的特定办公室/时间段内特定 ID_NUMB 发生了多少次。我也不是在寻找总数,而是在此处寻找 SEQ 列的内容:

ID_NUMB  |  APPEAR_NUM  |  OFFICE  |  TP  |    DATE    |  SEQ
1        |  1XZ2        |  01      |  01  |  9/7/2016  |  1
1        |  1XZ3        |  01      |  01  |  9/7/2016  |  2
2        |  3MN1        |  03      |  01  |  9/7/2016  |  1
3        |  J915        |  02      |  01  |  9/7/2016  |  1
1        |  1TY1        |  01      |  01  |  9/7/2016  |  1
3        |  P91D        |  05      |  01  |  9/7/2016  |  1
2        |  U11E        |  11      |  05  |  9/7/2016  |  1

虽然我环顾四周,发现了许多精细的编号解决方案,但由于计数似乎有多精细,大多数都不是我想要完成的。

我曾考虑将数据写入临时表,但使用我发现的一些信息并没有找到任何解决方案。同样,我尝试编写一个单独的查询,该查询可以检索此信息并添加序列号,这是对 MS Answers 站点上的解决方案的一种改编。我把它放在一边,因为这似乎是错误的方法。

我什至玩弄了将查询写入临时表,然后让一段 VBA 处理顺序编号,但这种方法也没有走得太远。

正如我概述的那样,在列中生成序列号的正确方法是什么?我不知所措。

4

2 回答 2

0

我认为这个 SQL 可能接近你想要的(基于有限的例子)它在表 T1 上执行 INNER JOIN - 并在动态构建 SEQ 之前进行简单排序

SELECT 
    a.ID_NUMB,
    a.ADJ_APPEAR_NUM,
    a.OFFICE,
    a.APP_TIME_PER AS TP,
    Format(a.[APP_DTE],"Short Date") AS APP_DATE,
    (SELECT Count(ID_NUMB) 
        FROM T1 b 
        WHERE (b.ADJ_APPEAR_NUM <= a.ADJ_APPEAR_NUM
        AND b.ID_NUMB = a.ID_NUMB 
        AND b.OFFICE = a.OFFICE
        AND b.APP_TIME_PER = a.APP_TIME_PER
        AND b.APP_DTE = a.APP_DTE)) AS SEQ
FROM T1 AS a
ORDER BY a.ID_NUMB, a.OFFICE, a.ADJ_APPEAR_NUM;   

查询结果(使用您的 T1 数据)

示例查询结果

于 2016-09-12T17:01:31.687 回答
0

对于此类任务,最直接的方法通常是使用DAO打开一个记录集,其中记录按您需要的顺序排列。

然后循环遍历记录集,为每个记录跟踪将强制一个新序列号的条件,或者只是将一个添加到前一个序列号。现在,构建序列号,更新记录,然后继续直到没有更多记录。

编辑:示例循环记录:

Dim rst As DAO.Recordset

'Me.RecordsetClone
Set rst = Me.RecordsetClone
rst.Sort = "Dato, ID asc"
Set rst = rst.OpenRecordset()
rst.MoveFirst
While rst.EOF = False
    Debug.Print rst!Dato.Value, rst!Id.Value
'    If SomeCondition = True Then
        rst.Edit
            rst!Dec1.Value = rst!Id.Value
        rst.Update
'   End If
    rst.MoveNext
Wend
于 2016-09-08T07:27:22.850 回答