2017-08-31 74 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