2

トランザクション テーブルとの内部結合を使用すると、アカウント番号が重複します。重複したアカウント番号が表示されないように制限するにはどうすればよいですか。

SELECT     A01_AccountMaster.AccountNumber, A01_AccountMaster.FamilyMemberType,
           A01_AccountMaster.AccountType, A01_AccountMaster.FamilyId, 
           A01_AccountMaster.Title, A01_AccountMaster.FirstName, 
           A01_AccountMaster.MiddleName, A01_AccountMaster.LastName,
           A01_AccountMaster.Suffix, A01_AccountMaster.OrganizationName,
           A01_AccountMaster.Status,
           T01_TransactionMaster.Date,
           T01_TransactionMaster.AccountNumber AS T01_Accountnumber  
FROM       A01_AccountMaster
INNER JOIN T01_TransactionMaster
      ON A01_AccountMaster.AccountNumber = T01_TransactionMaster.AccountNumber
WHERE      (A01_AccountMaster.Title = 'The')
           AND (T01_TransactionMaster.Date between '01/01/2010' and '09/12/2012')
ORDER BY   AccountNumber;
4

2 に答える 2

0

「T01_TransactionMaster.Date」などの要素をトランザクションテーブルから取得し、2つのトランザクションが同じアカウントに属することができるため、1つのアカウント行に対して複数のトランザクション日付を返すことができます。

コンピュータが適切なデータを返すことをどのように期待しますか?

さまざまな選択肢があります。

トランザクション列のselectステートメントを削除するのと同じように、このようなselectステートメントには少し重いように見えるDISTINCTを使用します。

SELECT DISTINCT A01_AccountMaster.AccountNumber, A01_AccountMaster.FamilyMemberType, A01_AccountMaster.AccountType, A01_AccountMaster.FamilyId, A01_AccountMaster.Title, A01_AccountMaster.FirstName, A01_AccountMaster.MiddleName, A01_AccountMaster.LastName, A01_AccountMaster.Suffix, A01_AccountMaster.OrganizationName, A01_AccountMaster.Status
FROM A01_AccountMaster 
INNER JOIN T01_TransactionMaster on (A01_AccountMaster.AccountNumber) = T01_TransactionMaster.AccountNumber 
WHERE (A01_AccountMaster.Title = 'The') 
and (T01_TransactionMaster.Date between '01/01/2010' and '09/12/2012') 
order by AccountNumber

または取引日を返す必要がある場合は、すべてのアカウントフィールドでgroupByを使用し、取引フィールドで集計を使用してさまざまな戦略を立てることができます(たとえば、アカウントの最後の取引の日付を持つ最大日を返す)。

SELECT A01_AccountMaster.AccountNumber,A01_AccountMaster.AccountType,........,max(T01_TransactionMaster.Date)
FROM A01_AccountMaster 
INNER JOIN T01_TransactionMaster on (A01_AccountMaster.AccountNumber) = T01_TransactionMaster.AccountNumber 
WHERE (A01_AccountMaster.Title = 'The') 
and (T01_TransactionMaster.Date between '01/01/2010' and '09/12/2012') 
group by A01_AccountMaster.AccountNumber,A01_AccountMaster.AccountType,........
order by AccountNumber
于 2012-09-12T23:54:20.770 に答える
0

私の提案は、トランザクション テーブルを要約して、そこから必要なものを取得することです。

データを集計するには、次のようなクエリを使用します。

select am.*, tm.NumTransactions
from A01_AccountMaster am join
     (select AccountNumber, count(*) as numtransactions
      from T01_TransactionMaster
      group by AccountNumber
     ) tm
     on am.AccountNumber = tm.AccountNumber
where . . .

サブクエリ レベルで集計を行うと、多くのフィールドで group by を実行する必要がないため、クエリ全体が簡素化されます。また、追加のテーブルを導入する場合、サブクエリ レベルで集計することで、他のテーブルのレコード間の相互作用によって引き起こされる問題を防ぐことができます。

于 2012-09-13T00:50:15.910 に答える