2016-09-07 27 views
2

假设您在数据库中有一张表,该表在9个办公地点间每天跟踪4到5次时间段的门票出现。在这些时间段中,人们可能会出现一张票(我想我们可以使用一种交易模式),或者他们可以出现很多(我见过15人,听说其他人多达50人)。基于组合密钥访问用于递增键/字段的SQL /逻辑

查询是使用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了多少次在一个特定的Office发生/拉拽日期。我还没有找一个总的,而一些沿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处理顺序编号,但这种方法也没有太多。

正如我概括的那样,在列中生成序号的正确方法是什么?我很茫然。

+0

从您的示例中不清楚'SEQ'应该如何编号。为什么最后三个条目不会递增为3,2,2?您的标准是在同一日期ID_NUMB,正确。?即使您将Office作为条件的一部分 - 最终的ID_NUMB 1仍应具有SEQ = 3,不应该吗? – dbmitch

+0

对临时表+ VBA查询SEQ是一种非常简单的方法 - 您是否有用于创建临时表的查询示例?还是VBA?你是否反对这种方法 - 或者如果它有效,你会接受吗? – dbmitch

+0

为了回应第一条评论@dbmitch,它实际上是几个因素的组合。你是正确的第一个应该是3,我会改变这一点。另外两个出现在不同的办公室或不同的时间(或两者)。最终可能是太粒度也许.. – dramerus

回答

0

我觉得这个SQL可能是接近你想要什么(基于有限的例子),它的INNER JOIN对表T1 - 和做了之前它简单梳理基础上飞的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

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 
+0

我喜欢这种方法的声音;但它可能会超出我的技能。当我试图通过身份验证凭据作为自动化拉动操作的一部分时,我探索了使用DAO打开记录集。我并不是非常成功,但我一直在努力学习,因为我一直在继续。你认为基于上面的SQL将是可能的吗?或者将数据写入临时表更有意义? – dramerus

+0

我为示例添加了一些示例代码。你应该明白这个主意。 – Gustav