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

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

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

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