2017-05-24 13 views
0

私は必要なデータを得るために私が参加している4つのテーブルを持っています。次のようにテーブルといくつかのサンプルデータは、次のとおりです。これらのナンバープレートが共通の基準に従っているためSQL Server 2014で結合テーブルのグループからmax(date)を取得する方法はありますか?

**TollTransaction table**  
AccountId EntryTransDt LicPlateNo 
1655024  24-05-2017   ABC123 
1655024  24-05-2017   DEF123 
1655024  24-05-2017   GHI123 
1655024  24-05-2017   JKL123 
1655024  24-05-2017   MNO123 


**Plate table**  
AccountId LicPlateNo EndDate 
11001  ABC123  2012-06-10 
1898884  ABC123  NULL 
1981834  DEF123  NULL 
14066  GHI123  NULL 
1770746  JKL123  NULL 
1005010  MNO123  NULL 


**Account table**  
AccountId AccountNumber CurrentBalance 
11001  10110014  0 
14066  10140668  0 
1005010  20050108  0 
1770746  27707463  3.9 
1898884  28988847  0 
1981834  29818345  0 


**FinTransMaster table**   
FinTransTypeCode BusinessDay AcctID 
PYMT    03-02-2015 11001 
PYMT    15-01-2015 11001 
PYMT    11-12-2014 14066 
PYMT    11-09-2014 14066 
PYMT    01-04-2016 1005010 
PYMT    02-10-2014 1005010 
PYMT    15-09-2015 1770746 
PYMT    30-11-2015 1898884 
PYMT    21-10-2015 1898884 
PYMT    23-03-2017 1981834 

TollTransactionテーブルでたAccountIdは、それらのナンバープレートでも同じです。

私はPlateテーブルからAccountIdsを取得し、次にAccountNumberを取得するためにAccountIdのAccountテーブルに参加する必要があります。

私が何をしようとしている


1)私は、支払いの現在のバランスを持っているアカウントを見つけようとしています。
2)支払いが最後に行われた日付(FinTransMasterテーブルからの最大BusinessDay)。
3)そのLicPlateNoのTollTransactionテーブルの最後のEntryTransDt。次のように

私のコードは次のとおりです。

SELECT A.AccountNumber 
     ,A.CurrentBalance 
     ,(SELECT MAX(BusinessDay) FROM FinTransMaster F WHERE A.AccountId = F.AcctID AND FinTransTypeCode = 'PYMT' GROUP BY AcctID) Last_Pymt_Date 
     ,(SELECT MAX(EntryTransDt) FROM TollTransaction GROUP BY LicPlateNo) Last_Transaction 

FROM TollTransaction T 
INNER JOIN Plate P ON T.LicPlateNo = P.LicPlateNo 
INNER JOIN Account A ON P.AccountId = A.AccountId 
--INNER JOIN FinTransMaster F ON A.AccountId = F.AcctID 

WHERE T.AccountId = '1655024' 
    AND P.EndDate IS NULL 
    AND A.CurrentBalance > 0 

ORDER BY Last_Pymt_Date DESC, A.AccountNumber 

私のコードは2つのSELECT MAX()クエリで間違っています。

最後の日付を取得するには、どのコードを使用する必要がありますか?

編集: 以下の回答に示唆されたコードを使用しましたが、あまりにも多くのレコードを取得しました。私が使用したコードは:

SELECT A.AccountNumber 
     ,A.CurrentBalance 
     --,(SELECT MAX(BusinessDay) FROM FinTransMaster F WHERE A.AccountId = F.AcctID AND FinTransTypeCode = 'PYMT' GROUP BY AcctID) Last_Pymt_Date 
     --,(SELECT MAX(EntryTransDt) FROM TollTransaction GROUP BY LicPlateNo) Last_Transaction 
     ,MAX(F.BusinessDay) over(Partition by F.AcctID) as Last_Pymt_date 
     ,MAX(T.EntryTransDt) over(Partition by T.LicPlateNo) as Last_Transaction 
FROM TollTransaction T 
INNER JOIN Plate P ON T.LicPlateNo = P.LicPlateNo 
INNER JOIN Account A ON P.AccountId = A.AccountId 
LEFT JOIN FinTransMaster F ON A.AccountId = F.AcctID 

WHERE T.AccountId = '1655024' 
    AND P.EndDate IS NULL 
    AND A.CurrentBalance > 0 

ORDER BY Last_Pymt_Date DESC, A.AccountNumber 

私はあまりにも多くのレコードを得た。

My TollTransactionsテーブルには、同じLicPlateNoの複数のレコードがあります。そのため、私はJOINの後に複数のレコードを取得しています。 Distinct T.LicPlateNoだけを他のテーブルにジョインすることができれば、私は単一のレコードを取得する必要があります。

+0

は、あなたのIDにごサブクエリに参加。 'WHERE T.AccountID = F.AccountId'および' WHERE T.AccountId = TollTransaction.AccountId' –

+0

T.AccountIDはF.AccountIDと等しくありません。したがって、Plate.AccountID = F.AccountIDのプレートテーブルに参加する必要があります – user1777929

答えて

0

あなたは以下のように結合を使用して試すことができます:

SELECT A.AccountNumber 
     ,A.CurrentBalance 
     --,(SELECT MAX(BusinessDay) FROM FinTransMaster F WHERE A.AccountId = F.AcctID AND FinTransTypeCode = 'PYMT' GROUP BY AcctID) Last_Pymt_Date 
     --,(SELECT MAX(EntryTransDt) FROM TollTransaction GROUP BY LicPlateNo) Last_Transaction 
     ,MAX(F.BusinessDay) over(Partition by F.AcctID) as Last_Pymt_date 
     ,MAX(T.EntryTransDt) over(Partition by T.LicPlateNo) as Last_Transaction 
FROM TollTransaction T 
INNER JOIN Plate P ON T.LicPlateNo = P.LicPlateNo 
INNER JOIN Account A ON P.AccountId = A.AccountId 
LEFT JOIN FinTransMaster F ON A.AccountId = F.AcctID 

WHERE T.AccountId = '1655024' 
    AND P.EndDate IS NULL 
    AND A.CurrentBalance > 0 

ORDER BY Last_Pymt_Date DESC, A.AccountNumber 
+0

ありがとう、Kannan。 EntryTransDtはTollTransactionテーブルTにのみあります。だから、私はMAX(T.EntryTransDt)を試しています...コードを実行しています。結果を待っています。それがどのように進むのかを教えてくれます。再度、感謝します。 – user1777929

+0

あなたは正しい –

+0

31分後、 'PRIMARY'ファイルグループがいっぱいであるため、データベース 'tempdb'に 'dbo.SORT temporary run storage:140840636776448'というオブジェクトのスペースを割り当てられませんでしたというエラーメッセージが表示されました。 '何か案は? – user1777929

関連する問題