2016-11-08 7 views
0

に基づいて、私はテーブルを次ていますSSIS/SQL Serverの - フラグ、複数の条件の列

ID | Number | Condition 1 | Condition 2 | Condition 3 | Condition 4 
1 | 1  | 1   | 2   | 1   | 1 
1 | 2  | 2   | 1   | 2   | 2 
2 | 5  | 2   | 2   | 2   | 1 
2 | 6  | 2   | 2   | 2   | 2 
3 | 7  | 1   | 1   | 2   | 1 
3 | 8  | 2   | 1   | 1   | 2 
3 | 3  | 2   | 1   | 2   | 2 
4 | 9  | 2   | 1   | 1   | 1 
4 | 4  | 1   | 1   | 1   | 2 
5 | 10  | 2   | 1   | 2   | 1 
5 | 13  | 2   | 1   | 2   | 2 

(かなりの混乱、そのことについて申し訳ありません)

あなたが見ることができるように、複数のIDがあります。私は条件に基づいて、各IDの1つを取らなければならない。だから、私はそれぞれの条件を一つ一つチェックし、その結果に基づいてカラムを追加したいと思っています。この背後にあるロジックは、(IDの各グループについて)1行がcondition = 1の場合、

です。両方の行が1または両方とも2の場合、次の条件をチェックします。

我々はID 1とレコードだけを取るのであれば、我々はID 1 - Number 1は私達が私達の出力に必要な正しいものである見ることができます。

しかし、ID 2とすれば、両方のレコードが同じ値を持つことがわかります。これは私たちに答えを与えません。その場合、我々はcondition 2を見て、そこに同じロジックを実装します。

condition 4は常にIDごとに '1' を持つ一つのレコードを持っています)

だから私の出力は次のようになります。

ID | Number | Condition 1 | Condition 2 | Condition 3 | Condition 4 | IsOk 
1 | 1  | 1   | 2   | 1   | 1   | 1 
1 | 2  | 2   | 1   | 2   | 2   | 2 
2 | 5  | 2   | 2   | 2   | 1   | 1 
2 | 6  | 2   | 2   | 2   | 2   | 2 
3 | 7  | 1   | 1   | 2   | 1   | 1 
3 | 8  | 2   | 1   | 1   | 2   | 2 
3 | 3  | 2   | 1   | 2   | 2   | 2 
4 | 9  | 2   | 1   | 1   | 1   | 2 
4 | 4  | 1   | 1   | 1   | 2   | 1 
5 | 10  | 2   | 1   | 2   | 1   | 1 
5 | 13  | 2   | 1   | 2   | 2   | 2 

何かアドバイス/提案?

これをSSISで使用するので、SSISまたは純粋なSQLコードのソリューションはすべて問題ありません。

誰かが不思議場合:私はCase

,CASE 
    when [Condition1] = 1 then 1 
    else CASE when [Condition2] = 1 then 1 
    else CASE when [Condition3] = 1 then 1 
     else  CASE when [Condition4] = 1 then 1 END 
     END 
     END 
    END AS IsOk 

でそれを試してみましたしかし、それはこのテーブルを導出自己参照で達成することができ、要求された結果

+0

あなた 'Condition'値は常に '1'または '2'であるか、彼らはあるのでしょう:同じIDのための「未OK]を行よりもrow_number高いと返されて、「OK」行の例より複雑なデータの例? – iamdave

+0

これらは常に「1」または「2」です。この場合、 'true' /' fasle'と言う別の方法です。 – DenStudent

+0

この表のユースケースについて少し詳しく説明できますか? Junk DimensionテーブルまたはFlagsテーブルから開始し、2番目のテーブルには各列のビットのみがあるようです。 –

答えて

2

を与えませんでした。基本的には、各行が独立して「OK」であるかどうかをチェックし、そのデータセットを自分自身に結合して、前の行がすでに「OK」とみなされているかどうかをチェックします。これはあなたの条件が常に1または2なので、row_numberを作成するときはConditionの順番で注文することができ、「最初の」行に「OK」が優先的にrow_numberになることが保証されます。

declare @t table(ID int 
       ,Number int 
       ,Condition1 int 
       ,Condition2 int 
       ,Condition3 int 
       ,Condition4 int 
       ); 
insert into @t values 
(1,1,1,2,1,1) 
,(1,2,2,1,2,2) 
,(2,5,2,2,2,1) 
,(2,6,2,2,2,2) 
,(3,7,1,1,2,1) 
,(3,8,2,1,1,2) 
,(3,3,2,1,2,2) 
,(4,9,2,1,1,1) 
,(4,4,1,1,1,2) 
,(5,10,2,1,2,1) 
,(5,13,2,1,2,2); 


with cte as 
(
    select row_number() over (order by ID 
            ,Condition1 
            ,Condition2 
            ,Condition3 
            ,Condition4 
          ) as rn 
      ,ID 
      ,Number 
      ,Condition1 
      ,Condition2 
      ,Condition3 
      ,Condition4 
      ,case when Condition1 = 1 then 1 
       else case when Condition2 = 1 then 1 
        else case when Condition3 = 1 then 1 
         else case when Condition4 = 1 then 1 
          else 2 
          end 
         end 
        end 
       end as IsOk 
    from @t 
) 
select c1.ID 
     ,c1.Number 
     ,c1.Condition1 
     ,c1.Condition2 
     ,c1.Condition3 
     ,c1.Condition4 
     ,case when isnull(c2.IsOk,0) = 1 then 2 else c1.IsOk end as IsOk 
from cte c1 
    left join cte c2 
     on(c1.ID = c2.ID 
      and c1.rn = c2.rn+1 
      ) 
order by c1.rn; 
+0

本当にありがとう、ありがとう! – DenStudent