私は必要なデータを得るために私が参加している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だけを他のテーブルにジョインすることができれば、私は単一のレコードを取得する必要があります。
は、あなたのIDにごサブクエリに参加。 'WHERE T.AccountID = F.AccountId'および' WHERE T.AccountId = TollTransaction.AccountId' –
T.AccountIDはF.AccountIDと等しくありません。したがって、Plate.AccountID = F.AccountIDのプレートテーブルに参加する必要があります – user1777929