在SQL Server 2014中具有案例多个条件[重复]

问题描述 投票:-3回答:2

我有一个表'FinancialTrans',其中只需要3个字段。

AcctID  TransTypeCode   DateOfTrans  Field 4  Field 5  Field 6....
123     TOLL            2016-06-06
123     TOLL            2016-06-02
123     TOLL            2016-04-28
123     PYMT            2016-03-11
123     TOLL            2015-12-22
123     TOLL            2015-12-22

我需要的: 我只需要在过去两年里没有Tolls和No Pymt的账号。

我对代码的尝试: 我知道我需要一个Having子句但不太确定如何编写它。 也许,一个不存在?

SELECT [AcctID]
      ,[TransTypeCode]
      ,[TransDate]

 FROM [FinancialTrans]

 WHERE (
        (TransTypeCode = 'TOLL' AND Max(TransDate) <= DATEADD(year, -2, GETDATE()))
     OR (TransTypeCode = 'PYMT' AND Max(TransDate) <= DATEADD(year, -2, GETDATE()))
       )

 GROUP BY AcctID, TransTypeCode, TransDate

我面临的挑战是,我想要的帐号是在过去两年没有付款的情况下付款的。我收到过去两年没有收费的帐号,但过去两年有付款。

问题:我如何确保在过去两年中获得的帐号不同?这个问题与之前提出的问题有所不同,因为现在的要求已经改变了。

sql sql-server having
2个回答
0
投票

不存在也会起作用。

Select  AcctID,
        TransTypeCode,
        TransDate
From    FinancialTrans ft1
Where   Not Exists (Select  1 
                    From    FinancialTrans ft2 
                    Where   ft1.AcctID = ft2.AcctID 
                    and     ft2.TransTypeCode IN ('TOLL','PYMT') 
                    and     ft2.DateOfTrans > DATEADD(year, -2, getdate()))

0
投票

你可以使用group byhaving

SELECT [AcctID]
FROM [FinancialTrans]
GROUP BY [AcctID]
HAVING MAX(CASE WHEN TransTypeCode = 'TOLL' THEN TransDate END) <= DATEADD(year, -2, GETDATE()) AND
       MAX(CASE WHEN TransTypeCode = 'PYMT' THEN TransDate END) <= DATEADD(year, -2, GETDATE()) ;

以上实际上要求存在两种类型的交易。做起来可能更好:

SELECT [AcctID]
FROM [FinancialTrans]
GROUP BY [AcctID]
HAVING SUM(CASE WHEN TransTypeCode IN ('TOLL', 'PYMT') AND TransDate > DATEADD(year, -2, GETDATE())
                THEN 1 ELSE 0
           END) = 0;
© www.soinside.com 2019 - 2024. All rights reserved.