2

毎日 4 ~ 5 回、9 か所のオフィスでチケットの出現を追跡するデータベースにテーブルがあるとします。これらの各期間で、人々は 1 つのチケット (トランザクション モデルを使用できると思います) に表示される場合もあれば、多数のチケットに表示される場合もあります (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

この種のタスクの場合、通常、DAOを使用してレコードセットを開き、レコードを必要な順序で並べ替えるのが最も簡単な方法です。

次に、新しいシーケンス番号を強制するか、前のシーケンス番号に 1 を追加する条件を追跡するレコードごとに、レコードセットをループします。次に、シーケンス番号を作成し、レコードを更新して、レコードがなくなるまで続行します。

編集:ループレコードの例:

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 に答える
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 に答える