我有一个'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
我需要什么:
在过去两年没有TOLL或PYMT的情况下,我需要打印一个Flag。
所以用简单的逻辑:
(When TransTypeCode is 'TOLL' and the MAX(DateOfTrans) is more than 2 years ago) AND
(When TransTypeCode is 'PYMT' and the MAX(DateOfTrans) is more than 2 years ago)
所以到目前为止我的代码是:
select *,
(case when max(case when FT.TransTypeCode in ('TOLL', 'PYMT')
then FT.DateOfTrans
end)
over (partition by FT.Acctid) >= dateadd(year, -2, getdate())
then 0 else 1
end) as MyFlag
from #temp_TableA A
INNER JOIN FinancialTrans FT ON A.AccountId = FT.AcctId
但是此代码带来了FinancialTrans表的所有其他字段,并将该帐号的每一行与前一个表连接起来。因此,我为每个帐号获得了大约1200个重复项。
问题:
1.如何为每个帐号获得1200个重复项?
2.当满足上述两个条件时,如何获得一个给出标志的列。
答案 0 :(得分:2)
使用GROUP BY
,这样您就可以获得一行帐户,而不是row_number
,您可以为每行计算一些内容。
SELECT A.AcctID,
MAX(case when FT.TransTypeCode in ('TOLL', 'PYMT')
and FT.DateOfTrans >= dateadd(year, -2, getdate())
then 1
else 0
end) as flag
FROM #temp_TableA A
INNER JOIN FinancialTrans FT ON A.AccountId = FT.AcctId
GROUP BY A.AcctID