这个问题在这里已有答案:
我有一个表'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
我面临的挑战是,我想要的帐号是在过去两年没有付款的情况下付款的。我收到过去两年没有收费的帐号,但过去两年有付款。
问题:我如何确保在过去两年中获得的帐号不同?这个问题与之前提出的问题有所不同,因为现在的要求已经改变了。
不存在也会起作用。
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()))
你可以使用group by
和having
:
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;