2016-11-08 3 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, исходя из условий. Итак, я хочу проверить каждое условие по одному и добавить столбец на основе результата в моем выходе. Логикой этого является

if (для каждой группы идентификаторов) одна строка имеет condition = 1, то это правильный вариант. Если обе строки равны 1 или оба равны 2, тогда мы проверяем следующее условие.

Итак, если мы возьмем только записи с ID 1, мы можем видеть ID 1 - Number 1 является правильным нам нужно в нашей продукции.

Но если мы возьмем ID 2, мы увидим, что обе записи имеют одинаковое значение, что не дает нам ответа. В этом случае мы смотрим на condition 2 и реализуем там ту же логику.

(condition 4 ВСЕГДА будет иметь одну запись с '1' для каждого ID)

Так что мой выход будет:

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' или они просто примеры более сложных данных? – iamdave

+0

Они всегда будут '1' или' 2'. Это просто еще один способ сказать «true' /' fasle »в этом случае – DenStudent

+0

Можете ли вы дать немного больше информации о прецеденте для этой таблицы? Похоже, вы начинаете с таблицы нежелательных измерений или таблицы флагов, где вторая имеет только бит в каждом столбце. –

ответ

2

Это может быть достигнуто с помощью производной таблицы самостоятельно ссылочной. По сути, вы проверяете, будет ли каждая строка независимой «Ok», а затем присоединиться к этому набору данных к себе, чтобы проверить, была ли предыдущая строка уже «Ok», и в этом случае отметьте ее как «Не Ok». Это работает, потому что ваши условия всегда 1 или 2, поэтому при создании row_number вы можете заказать Condition и который гарантирует, что «первая» строка будет «Ok» будет иметь предпочтительный row_number ie: Вы не получите никаких случаи с «Ok» подряд возвращается с более высоким, чем row_number «Не Ok» строки для того же ID:

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

Смежные вопросы