SQL Server 2014中具有多个条件的案例

时间:2017-11-15 17:20:46

标签: sql sql-server case

我有一个'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.当满足上述两个条件时,如何获得一个给出标志的列。

1 个答案:

答案 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