1

私はテーブルMemberとを持っていTransactionます。表Memberには と の 2 つの列がMemberIDありMemberNameます。テーブルには 、 、のTransaction3 つの列があります。MemberIDTransactionDateMemberBalance

表の行は次のとおりです。

Member:

MemberID           MemberName
=============================
1                  John
2                  Betty
3                  Lisa

Transaction:

MemberID        TransactionDate         MemberBalance
=====================================================
1               13-12-2012              200
2               12-12-2012              90
1               10-09-2012              300

各の最新 (最大)を照会したいと思いMemberID, MemberNameます。MemberBalanceTransactionDateMemberID

私のクエリは次のようなものです:

SELECT 
    t.MemberID, m.MemberName , t.MemberBalance
FROM 
    Member AS m 
INNER JOIN 
    Transaction AS t ON m.MemberID = t.MemberID 
WHERE 
    t.TransactionDate IN (SELECT MAX(TransactionDate)
                          FROM Transaction 
                          GROUP BY MemberID)

このクエリは次を返します。

MemberID           MemberName         MemberBalance
===================================================
1                  John               200
2                  Betty              90

私の問題は、クエリが返されるようにすることです:

MemberID           MemberName         MemberBalance
===================================================
1                  John               200
2                  Betty              90
3                  Lisa               NULL

テーブルMemberIDに存在しなくてもメンバーを表示したい。Transaction

どうすればいいですか?

ありがとうございました。

4

5 に答える 5

5

次のようなものも使用できます。

SELECT m.MemberID, m.MemberName, t1.MemberBalance
FROM Member AS m 
LEFT JOIN
(
  select max(transactionDate) transactionDate, 
    MemberID
  from Transactions
  group by MemberID
) AS t 
  ON m.MemberID = t.MemberID 
left join transactions t1
  on t.transactionDate = t1.transactionDate
  and t.memberid = t1.memberid

デモで SQL Fiddle を参照してください

于 2012-11-09T03:15:10.710 に答える
2

メンバーを結果セットに保持するには、外部結合が必要です。

また、内部選択クエリの memberid に条件を追加することを忘れないでください。あるユーザーの最大日付が別のユーザーの非最大日付と一致する場合に問題が発生する可能性があるためです (2 番目のユーザーに対して where 条件が 2 回渡されます)。彼の取引日は選択の結果に 2 回表示されるため、1 つは実際の最大日付であり、もう 1 つは非最大日付に一致する一部のユーザーの最大日付です)。

于 2012-11-09T03:15:23.420 に答える
2

MemberID が Transaction テーブルに存在しない場合でも表示されるメンバー

Member テーブルで LEFT JOIN を使用して行を Transaction テーブルに保持できます。

ここで、TransactionDate は各 MemberID の最新 (最大) です。

SQL Server 2005 以降では、ROW_NUMBER()を使用することをお勧めします。

   SELECT MemberID, MemberName, MemberBalance
     FROM (
   SELECT m.MemberID, m.MemberName , t.MemberBalance,
          row_number() over (partition by m.MemberID order by t.TransactionDate desc) rn
     FROM Member AS m 
LEFT JOIN [Transaction] AS t ON m.MemberID = t.MemberID 
        ) X
    WHERE rn=1;
于 2012-11-09T03:13:00.333 に答える
1

を使用する必要がありますLEFT JOIN。また、2 人のメンバーが同時にトランザクションを行った場合、両方のユーザーに対して 2 つの行を取得できるため、クエリでエラーが発生しました。

これを試して

SELECT t.MemberID, m.MemberName , t.MemberBalance
FROM Member AS m 
    LEFT JOIN Transaction AS t ON m.MemberID = t.MemberID AND t.TransactionDate=
    ( 
        SELECT MAX(TransactionDate)
        FROM Transaction T2
        WHERE T2.MemberID=t.MemberID
    )
于 2012-11-09T03:15:28.370 に答える
0
SELECT a.MemberId,a.MemberName,a.MemberBalance
FROM
(
SELECT m.MemberId,m.MemberName,t1.MemberBalance
      ,ROW_NUMBER() OVER(PARTITION BY m.MemberId ORDER BY t1.TransactionDate DESC) AS RN
FROM
@Member m OUTER APPLY (SELECT t.MemberId,t.MemberBalance,t.TransactionDate
                       FROM @Transaction t WHERE m.MemberId=t.MemberId) t1
)a
WHERE a.RN=1
于 2012-11-09T04:46:07.187 に答える