2017-05-24 37 views
0

我有四張表,我正在加入,以獲取我需要的一些數據。是表和一些示例數據如下:如何從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,然後加入AccountIds上的Account表以獲取AccountNumber。

我想要做的事:
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 

我的代碼是錯誤的兩個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 

但是我得到了太多的記錄。

我的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.賬戶ID – 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

的Plate表。謝謝Kannan。 EntryTransDt只在TollTransaction表T中。所以,我試着將MAX(T.EntryTransDt)結束......現在運行代碼。等待結果。會告訴你這件事的進展的。再次感謝。 – user1777929

+0

是的,你是正確的 –

+0

運行31分鐘後,我收到一條錯誤消息,說'無法爲數據庫'tempdb'中的對象'dbo.SORT臨時運行存儲:140840636776448'分配空間,因爲'PRIMARY'文件組已滿。 「有任何想法嗎? – user1777929