2014-09-02 5 views
0

У меня есть таблица ...Обновление с несколькими условиями. SQL 2008

ProjectID UserID RoleID 
101   1   10 
101   2   10 
102   2   10 
102   3   10 
103   1   10 

В настоящее время существует только один тип роли, роли «10», но я хотел, чтобы добавить новую роль, роль «11», который будет выступать в качестве руководства. Поэтому любой проект, у которого есть пользователь с ролью «10», должен иметь преимущество. Выбранное быть ведомым пользователь будет основан на списке агентом PRIORITY, в этом примере мы будем говорить заказ 1, 2, 3.

Ожидаемый результат ...

ProjectID UserID RoleID 
101   1   11 
101   2   10 
102   2   11 
102   3   10 
103   1   11 
+0

И что вы сделали для этого? – olyv

ответ

1

Вы можете выяснить, который имеет наивысший приоритет, используя row_number(). SQL Server позволяет делать это в обновляемом CTE, поэтому запрос выглядит так:

with toupdate as (
     select t.*, 
      row_number() over (partition by projectid 
           order by (case when userid = 1 then 1 
               when userid = 2 then 2 
               when userid = 3 then 3 
               else 4 
              end 
             ) 
           ) as PriorityForLead 
     from table t 
    ) 
update toupdate 
    set RoleId = 11 
    where PriorityForLead = 1; 
+0

Так что, пока я не смог заставить это работать правильно, я могу понять его логику. Однако, похоже, это будет делать только обновление, где userid = 1, что не соответствует ожидаемому результату. –

+0

@DougMocniak. , , Вы, похоже, не понимаете его логики. Это обновит первого пользователя в каждом проекте на основе правил, которые вы указали для определения приоритетов. –

+0

@DougMocniak - 'PriorityForLead = 1' не только обновляет userid = 1, он обновляется на основе первого последовательного номера в инкрементальном числе, которое упорядочивается с помощью идентификатора пользователя. Запустите его без обновления и просмотрите результаты. – Hogan

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