2

マスターテーブルとトランザクションテーブルの2つのテーブルからレコードをプルしようとしています。

テーブルにはすべてのMasterアカウントIDが含まれています。私のテーブルには、、、、およびの3つのtransaction列を持つこれらのアカウントによって実行されるトランザクションがあります。activity dateincomecharge type

表ではtransaction、これらのアカウントの一部は、特定の日付範囲内にトランザクションを実行していないため、まったく表示されない場合があります。ただし、これらのアカウントをクエリしたときに結果リストに表示するには、これらのアカウントが必要です。

したがって、私のデータは次のようになります。

     Master Table:                         Transaction Table:

    | AccountID  |              | AccountID | ChargeType | ActivityDate| Income |
    --------------              -------------------------------------------------
    |      1     |              |     2     |    2000    |  8/31/2012  | $99.00 |
    |      2     |              |     3     |    2000    |  7/31/2012  | $79.00 |
    |      3     |              |     5     |    2000    |  9/30/2012  | $79.00 |
    |      4     |
    |      5     |

私のクエリは現在次のようになっています:

select
    a.AccountID,
    b.ChargeType,
    b.ActivityDate,
    b.Income
From
    MasterTable as A
left join
    TransactionTable as B on a.AccountID = b.AccountID
where
    a.AccountID in ('1','2','3','4','5')
    and
    b.ActivityDate between '5/1/2012' and '11/30/2012'

私が理解していることから、このクエリは、選択した5つのアカウントすべてを一覧表示NULLし、に見つからないアカウントの値を表示する必要がありますTransactionTable

私が期待する結果:

        | AccountID | ChargeType | ActivityDate| Income |
        -------------------------------------------------
        |     1     |    NULL    |     NULL    |  NULL  |
        |     2     |    2000    |  8/31/2012  | $99.00 |
        |     3     |    2000    |  7/31/2012  | $79.00 |
        |     4     |    NULL    |     NULL    |  NULL  | 
        |     5     |    2000    |  9/30/2012  | $79.00 |

代わりに私が受け取る間違った結果:

         | AccountID | ChargeType | ActivityDate| Income |
         -------------------------------------------------
         |     2     |    2000    |  8/31/2012  | $99.00 |
         |     3     |    2000    |  7/31/2012  | $79.00 |
         |     5     |    2000    |  9/30/2012  | $79.00 |

私はここで何か基本的なことを誤解していると思います。どんな助けでも大歓迎です!

前もって感謝します!

4

4 に答える 4

6

その理由は、where句で「b」テーブルが参照されているため、NULL値が除外されるためです。

条件をon句に移動します。

From
    MasterTable A left join
    TransactionTable B
    on a.AccountID=b.AccountID and
       a.AccountID in ('1','2','3','4','5') and
       b.ActivityDate between '5/1/2012' and '11/30/2012'
于 2012-11-30T16:53:29.617 に答える
1

私は以下を使用します:

(b.ActivityDate is NULL or b.ActivityDate between '5/1/2012' and '11/30/2012' ) 

元のクエリが

 select
       a.AccountID,
       b.ChargeType,
       b.ActivityDate,
       b.Income
 From
       MasterTable as A
       left join
       TransactionTable as B on a.AccountID=b.AccountID
 where
       a.AccountID in ('1','2','3','4','5')
       and
       (b.ActivityDate is NULL or b.ActivityDate between '5/1/2012' and '11/30/2012' ) 

しかし、以下の答えはおそらくより良いでしょう。

于 2012-11-30T17:01:10.450 に答える
1

WHERE条項の最後のフィルターを;に変更します。SQLフィドルの例

DECLARE @d1 DATETIME, @d2 DATETIME
SELECT @d1 = '5/1/2012', @d2 = '11/30/2012'


SELECT ...
WHERE a.AccountID in (1,2,3,4,5) AND
ISNULL(b.ActivityDate, @d1) BETWEEN @d1 and @d2
于 2012-11-30T16:55:10.513 に答える
0

以下のコードを使用するだけです。

SELECT
    A.AccountID,
    B.ChargeType,
    B.ActivityDate,
    B.Income
From MasterTable AS A
LEFT JOIN  TransactionTable AS B 
ON A.AccountID = B.AccountID

コードで条件を使用する B.ActivityDate BETWEEN '5/1/2012' AND '11/30/2012'と、期待した結果が得られません。のためにAccountID = 1ActivityDateですNULL。したがって、との記録は AccountID = 1あなたの中間条件を満たさないでしょう。

于 2012-12-04T07:50:52.797 に答える