0

多くのベンダーの多くのトランザクションを含む Microsoft Access のトランザクション テーブルがあります。各ベンダーに連続したトランザクション番号が付けられているかどうかを確認する必要があります。シーケンスがどうなるか、またはベンダーごとのトランザクション数がわかりません。ベンダーの連番を識別し、存在する場合はフィールドを「1」に設定する SQL を作成する必要があります。最初にベンダーごとのトランザクション数を決定し、次にそれらのトランザクションをループしてトランザクション数を比較するネストされたループを実行することを考えていました。誰でもこれで私を助けることができますか??

4

3 に答える 3

0

これが最も簡単なアプローチかどうかはわかりませんが、うまくいくと思います。複数の手順を使用することをお詫びしますが、Jet 4.0 の種類では強制的にそうする必要があります。**

すべてのtransactionId値は正の整数であり、シーケンスは によって等間隔に配置されたtransactionId値のセットであると仮定しましたvendorId。さらに、 にキーがあると仮定し(vendorId, transactionId)ます。

最初のステップでは、無効な行を排除します。たとえば、シーケンスを決定できるようにするには、少なくとも 3 つの行が必要です (他のすべての行は成功するか失敗するか?)。ここでも他のジャンクを除外したい場合があります (例NULL: 値を持つ行/グループ):

CREATE VIEW tbl1
AS
SELECT T1.vendorId, T1.transactionId
  FROM tbl AS T1
 WHERE EXISTS (
               SELECT T2.vendorId
                 FROM tbl AS T2
                WHERE T2.vendorId = T1.vendorId
                GROUP 
                   BY T2.vendorId
                HAVING COUNT(*) > 2
              );

各ベンダーの最低値を見つけます (後で役立ちます)。

CREATE VIEW tbl2
AS
SELECT vendorId, MIN(transactionId) AS transactionId_min
  FROM tbl1
 GROUP 
    BY vendorId;

transactionId_base_zero各ベンダーの最低値を差し引いて、すべてのシーケンスをゼロ ( ) から開始します。

CREATE VIEW tbl3
AS
SELECT T1.vendorId, T1.transactionId, 
       T1.transactionId - T2.transactionId_min AS transactionId_base_zero
  FROM tbl1 AS T1
       INNER JOIN tbl2 AS T2
          ON T1.vendorId = T2.vendorId;

に基づいてステップ値 (隣接するシーケンス値の差) を予測し、MAX各ベンダーの値を設定しますMINCOUNT

CREATE VIEW tbl4
AS
SELECT vendorId, 
       MAX(transactionId_base_zero) / (COUNT(*) - 1)
          AS transactionId_predicted_step
  FROM tbl3;

予測されたステップ値が各シーケンス値、つまり (疑似コード) に対して真を保持することをテストします (前の値がないためthis_transactionId - step_value = prior_transactionId、最小値を省略します!):transactionId

SELECT DISTINCT T.vendorId
  FROM tbl3 AS T
 WHERE T.transactionId_base_zero > 0
       AND NOT EXISTS (
                       SELECT *
                         FROM tbl3 AS T3
                              INNER JOIN tbl4 AS T4
                                 ON T3.vendorId = T4.vendorId      
                        WHERE T.vendorId = T3.vendorId
                              AND T.transactionId_base_zero 
                                     - T4.transactionId_predicted_step 
                                        = T3.transactionId_base_zero
                      );

上記のクエリは、値が連続していないvendorIdベンダーの を返す必要があります。transactionId


** 私の弁護では、Jet 4.0 でいくつかのバグに遭遇しました。回避策をコーディングする必要がありました。はい、私はバグが Jet 4.0 (またはその OLE DB プロバイダー) にあることを知っています。なぜなら、a) SQL Server を使用して結果を再確認し、b) ロジックに逆らっているからです! (SQL 独自の奇妙な 3VL ロジックでさえ :)

于 2011-04-19T12:37:49.603 に答える
0

1 つの連続したセット (一方のトランザクション番号が他方に続く 2 つのレコード) を検索するには:

SELECT transactionId FROM tbl WHERE EXISTS 
  (SELECT * FROM tbl as t WHERE tbl.vendorId = t.vendorId 
   AND tbl.transactionId+1 = t.transactionId)
于 2011-04-16T17:34:54.037 に答える
0

任意のベンダーのナンバリングのギャップを見つけるクエリを使用します。それがレコードを返す場合、すべてのベンダーの連続したナンバリングはありません。

SELECT *
FROM tblTransaction As T1
WHERE (
    SELECT TOP 1 T2.transactionID
    FROM tblTransaction As T2
    WHERE T1.vendorID = T2.vendorID AND
          T1.transactionID < T2.transactionID
    ORDER BY T2.transactionID
) - T1.transactionID > 1

これが行うことは、テーブル内の各レコードに対して、同じベンダーの同じテーブル内の最小番号の他の transactionID を探し、最初のものよりも大きい番号の transactionID を持つことです。そのレコードの transactionID 値が最初のレコードの値よりも 2 つ以上大きい場合は、ベンダーの番号付けにギャップがあることを表します。

編集:要求に応じて上記の変数名を変更しました。

于 2011-04-16T17:47:04.430 に答える