2017-11-15 5 views
0

テーブル「FinancialTrans」には多くのフィールドがありますが、それらのフィールドのうち3つだけが私に関係しています。私は必要なものSQL Serverで複数の条件が発生するケース

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 


私は最後の2年間にはTOLLまたはPYMTが存在しないときの旗を印刷する必要があります。平野ロジックでそう

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テーブルの他のすべてのフィールドに沿ってもたらし、そのアカウントの各行を結合します

(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) 

だから私のコードは、これまでのところです前の表の番号。したがって、私は各口座番号に対して約1200の重複を取得します。

質問:
1.どのように私は、各口座番号1200個の重複を得ることはありませんか?
2.上記の2つの条件が満たされたときにフラグを与える列を取得する方法を教えてください。

+0

ここで質問は何ですか? –

+0

私はあなたが達成しようとしていたことについてはっきりしていませんでした。しかし、私はあなたにダウンボントを与えませんでした。 –

答えて

2

GROUP BYを使用すると、すべての行について何かを計算するrow_numberの代わりに、アカウントの1行が得られます。

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 
関連する問題