2017-08-31 47 views
0

我有4個表,我需要加入從中提取數據:如何在SQL Server 2014的JOIN中獲取MAX值?

| Account Table: A | Plate Table: P | TollTransaction : T | FinTrans Table: F | 
================================================================================= 
| AccountId   | AccountId  | AccountId   | AcctId   | 
| AccountNumber  | LicPlateNo  | LicPlateNo   | FinTransTypeCode | 
| CurrentBalance | EndDate  | EntryTransDt   | BusinessDay  | 
| ActualTagDeposit |    |      |     | 
================================================================================= 

的關係:

A.AccountId = P.AccountId = F.AcctId != T.AccountId <--(NOT EQUAL) 
P.LicPlateNo = T.LicPlateNo 

我想表明:

A.AccountNumber 
A.CurrentBalance 
Max(BusinessDay) -->(Last Payment Date) 
Max(EntryTransDt)  -->(Last Transaction Date) 
ActualTagDeposit 

WHERE P.EndDate IS NULL 
    AND A.CurrentBalance > 0 
    AND F.FinTransTypeCode = 'pymt' 
    AND Max(EntryTransDt) <= '2017-07-28' 
    AND A.ActualTagDeposit >= 10 

我的代碼嘗試到目前爲止:

SELECT A.AccountNumber 
     ,A.CurrentBalance 
     ,MAX(F.Last_Pymt_date) AS Last_Pymnt_Date 
     ,MAX(T.Last_Transaction) AS LastTransaction 
     ,A.ActualTagDeposit 

FROM 

    (SELECT AccountId 
      ,LicPlateNo 
      ,MAX(EntryTransDt) AS Last_Transaction 
     FROM TollTransaction 
     GROUP BY AccountId, LicPlateNo 
    ) T 
INNER JOIN Plate P ON T.LicPlateNo = P.LicPlateNo 
INNER JOIN Account A ON P.AccountId = A.AccountId 
LEFT JOIN 
    (SELECT AcctId 
      ,FinTransTypeCode 
      ,MAX(BusinessDay) AS Last_Pymt_Date 
     FROM FinTransMaster 
     GROUP BY AcctID, FinTransTypeCode 
    ) F ON A.AccountId = F.AcctId 

WHERE P.EndDate is null 
    AND A.CurrentBalance > 0 
    AND F.FinTransTypeCode = 'pymt' 
    AND Last_Transaction <= '2017-07-28' 
    AND A.ActualTagDeposit >= 10 

GROUP BY AccountNumber, CurrentBalance, Last_Pymt_date, Last_Transaction, A.ActualTagDeposit 

ORDER BY AccountNumber 

但我得到與此代碼重複。顯然,我的代碼中的MAX部分無法正常工作?

結果我得到的樣品:

AccountNumber CurrentBalance Last_Pymnt_Date LastTransaction ActualTagDeposit 
21233815  12.34  2016-12-12  2016-08-15  10.00 
21233815  12.34  2016-12-12  2017-03-11  10.00 
21234567  123.12  2017-06-20  2016-12-25  10.00 
21234568   1.23  2017-06-05  2012-07-12  10.00 
21234568   1.23  2017-06-05  2012-07-21  10.00 
+1

刪除'LAST_Pymnt_Date'和' 「GROUP BY」中的Last_Transaction' –

+1

好吧,所以您已經確定最大(最後一個事務)不起作用。那會讓你看到那張桌子。你不是由來自該表的其他東西組成的。 我的猜想:可能你有多個牌照的帳戶? –

+0

是的。我的帳號有多個牌照。但我只是想要最後的過境,不管哪個車牌越過。 – user1777929

回答

1

這是因爲發生了一個帳戶可以有多個車牌。如果添加P.LicPlateNo到您當前選擇,你會看到這樣的事情:

AccountNumber CurrentBalance Last_Pymnt_Date LastTransaction ActualTagDeposit LicPlateNo 
21233815   12.34  2016-12-12  2016-08-15  10.00   A123 
21233815   12.34  2016-12-12  2017-03-11  10.00   B456 

我想說的只是刪除所有Plates在一起,但好像你必須使用它爲紐帶,以表T,所以下一步最好的做法是在外部查詢中執行MAX()(如您所做的那樣)。問題是,你也有你的外GROUP BY,以防止它們在你的MAX()

更改您的外組被聚合將解決問題的淋漓盡致列:

GROUP BY AccountNumber, CurrentBalance, A.ActualTagDeposit