1

私は現在、保険会社で現在の仕事に就く前に実装されたパラドックス データベースを使用しています。

簡単に言えば、すべてのアクティブなクライアントの借方/貸方残高のクエリをコンパイルしようとしているときに、個々のクライアントごとにクエリを実行すると、クライアントごとに異なる残高が得られるということです。10 万の顧客ベースと 200 万を超える取引数では、そうするのは現実的ではありません。だからここに私が個々のクライアントのために何をするかがあります:

コード:

SELECT COUNT(Debit) as NumberOfDebits
       , COUNT(Credit) as NumberOfCredit
       , SUM(Debit) as DebitTotal
       , SUM(Credit) as CreditTotal 
FROM MemberTransactions 
WHERE MemberID = '####000094';

上で述べたように、これはメンバーに適切なバランスを与えますが、次のことを行うと:

SELECT MemberID
       , COUNT(Debit) as NumberOfDebits
       , COUNT(Credit) as NumberOfCredit
       , SUM(Debit) as DebitTotal
       , SUM(Credit) as CreditTotal 
FROM MemberTransactions 
GROUP BY MemberID;

テーブル内のほとんどのメンバーについて、異なるカウントと合計の両方の結果が得られます。

ここに表の構造を示します。これにより、私が何を処理しなければならず、何を達成したいのかを理解できるようになります。すべての行は、メンバーのアカウントへの借方または貸方のいずれかを持つ単一のトランザクションです。したがって、私がやりたいことは、すべての借方と貸方を、すべてのメンバーごとにそれぞれ 1 つのセルに合計することです。だから私は、すべてのメンバーのすべてのクレジットとデビットを合計すると考えてグループ化しましたが、そうはなりません。では、どうすればそれについて行くことができますか。メンバーの詳細から membernr で外部結合を実行しようとしましたが、グループ化する必要があり、最終的に同じ結果が得られます

テーブル構造:

 PeriodNr                I
 EffectiveDate           D
 Entrynr                 +
 MemberNr                A
 Date                    D
 JournalNr               A
 ReferenceNr             A
 DtAmount                N
 CtAmount                N
 Narration               A
 ModifyUserId            A
 ModifStamp              @

私が気づいたことの1つは、次のクエリを実行した後です。

 SELECT COUNT(A.CtAmount) as CreditCount
       , Sum(A.CtAmount) as Credit
       , COUNT(A.DtAmount) as DebitCount 
       , SUM(DtAmount) as Debit
       , M.MemberNr
       , M.Premium  
 FROM MemAcc as A  
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr  
 GROUP BY M.MemberNr, M.Premium;

一番上に、MemberNr がなく、カウント、借方、貸方の数が非常に多い 1 つの行があります。どのアカウントよりもはるかに高いので、何らかの理由で欠落しているトランザクションがこの行に入ると推測しています。

たとえば、メンバー X を一意にクエリすると、3094 の借方と貸方が取得され、55 の借方カウントと 18 の貸方カウントが得られます。これは、そのメンバーのテーブルにあるレコードの数と一致しますが、上記のクエリを実行すると、クレジット カウント 2、デビット カウント 19、クレジット 1590、デビット 2090 が得られます。

だから私は困惑しています。これが Paradox の問題なのか、それとも私の SQL の理解不足なのかはわかりません。

そうそう、空白のメンバーのクレジット数は 273、借方カウントは 341、貸方は 19030、借方は 17168 です。

4

3 に答える 3

0

3番目のクエリから得られた結果は、MemberNrがnullであるMemAccテーブルに多数のレコードがあることを示しています。それらを適切なメンバーにアタッチする方法がないため、それらはすべてグループ化され、メンバーのMemAccレコードが少なくなるように見えます。

于 2010-01-25T12:13:26.853 に答える
0

memberNr は MemAcc テーブルで NULL ではない可能性があります。左外部結合だけでは Member テーブルにはありませんが、メンバー テーブルの列でグループ化を行っているため、MemAcc エントリが存在しないため、NULL として表示されます。メンバー テーブル。

たとえば、これを行う場合:

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 GROUP BY A.MemberNr, M.Premium; 

異なる結果が表示されます。少なくとも、Member に存在しなくなった MemberNr の値です。

あなたの奇妙な結果については。Paradox テーブルの行数の制限を思い出したようですが、その制限に近づいている可能性があります。もちろんそうではないかもしれません - 使用している Paradox のバージョンとデータへのアクセス方法によって異なります。

最悪のシナリオでは、これらのクエリのいくつかを一緒に UNION する必要があることがわかりました。例えば

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 WHERE A.MemberNr <= 100000
 GROUP BY A.MemberNr, M.Premium; 

 UNION

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 WHERE A.MemberNr > 100000
 GROUP BY A.MemberNr, M.Premium; 
于 2010-02-02T13:44:16.217 に答える
0

これが Paradox の問題なのか、それとも私の SQL の理解不足なのかはわかりません。

「単一メンバー」クエリの結果セットと「すべてのメンバー」クエリの同等の行は、同じカウントと合計を返すと予想されます。それがあなたの期待でもあったのなら、あなたの SQL に対する理解を「不適切」とは言いません。

この種の問題を診断するのは困難です。あなたが持っている1つの手がかりはこれです:

テーブル内のほとんどのメンバーについて、異なるカウントと合計の両方の結果が得られます。(私のものを強調)

あなたがする必要があるのは、両方のクエリが同じ結果を返すいくつかのメンバーを選び、異なる結果を持つメンバーと何が違うのかを発見することです.

于 2010-01-25T11:34:05.333 に答える