如何在SQL Server 2014中的JOIN中获取MAX值?

问题描述 投票:0回答:1

我需要加入4个表来从中提取数据:

| 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
sql sql-server max
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.