访问SQL / Logic以增加基于组合键的键/字段

时间:2016-09-07 18:09:21

标签: sql access-vba duplicates ms-access-2013 autonumber

假设您在数据库中有一个表,该表每天跟踪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")));

我意识到上面的代码需要清理以便于阅读,并且它可能没有那么高效。那部分我不能相信,我从一位同事那里继承了所有这一切,并且刚刚开始围绕它。

查询结果包含大量信息,其中一些(大多数)与我正在尝试完成的内容无关。捕获所有这些信息非常重要,因为信息一旦消失就消失了。随着陈述:

我正在尝试做什么:

我正在尝试合并一个键/顺序编号的列,它会告诉我在特定的Office /时间段内,特定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站点上找到the solution的匹配类型。我把它放在一边,因为它似乎是错误的方法。

我甚至玩弄了将查询写入临时表,然后让一块VBA处理顺序编号,但这种方法也没有太过分。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的数据)

Sample Query Results