2013-02-20 3 views
-1

У меня есть представление базы данных, которое составлено из других представлений, у которых есть пользователь и их текущий уровень сертификации.Установить статус пользователя на основе значений полей

Фокус в том, что пользователь может иметь более старую сертификацию из унаследованной системы, и до тех пор, пока это не истечет через несколько месяцев, я должен принять это во внимание.

3 уровня сертификации являются «новичок», «специалист» и «магистр»

В большинстве случаев пользователь будет либо иметь сертификат от прежней системы или будет достигнуто определенный уровень сертификации от новой системы , и в этом случае у меня есть свой уровень сертификации, и проблем нет. Однако существуют редкие ситуации, которые могут привести к тому, что пользователь, получивший «эксперт» из старой системы, завершил «мастер» в новой системе. В этом случае я хочу, чтобы их уровень сертификации был установлен на «master», так как он является более высоким из двух.

Любые идеи, как достичь этого с точки зрения?

Столбцы «UserId», «USERFIRSTNAME», «USERLASTNAME» и «CertificationLevel»

я пытался заявления случае, временные таблицы и если заявления, но просто не могу показаться, чтобы получить то, что мне нужно.

Логика довольно проста: если для пользователя более 1 строки, возьмите самый высокий уровень сертификации и отбросьте другую.

Большое спасибо заранее за любые предложения

+0

Как определить, какой уровень сертификации выше? И опубликуйте то, что вы пробовали, это должно облегчить понимание того, что вам нужно. – fancyPants

+0

Есть только 3 уровня сертификации, и они находятся в порядке, как указано выше, новичок, эксперт, а затем мастер является самым высоким – richardterris

+0

Но у вас нет столбца, который указывает этот порядок? – fancyPants

ответ

3

Вот подход:

Вы даете каждый уровень номер и получить максимальное количество и декодировать снова оттуда.

select userid, case when max_lvl = 1 then 'beginner' 
        when max_lvl = 2 then 'expert' 
        when max_lvl = 3 then 'master' end as certificationlevel 
from 
    (select userid, MAX(case when certificationlevel = 'beginner' then 1 
         when certificationlevel = 'expert' then 2 
         when certificationlevel = 'master' then 3 end) as max_lvl 
    from test 
    group by userid) test; 

Это соответствует вашим потребностям?

http://www.sqlfiddle.com/#!6/277e6/5

+0

Это отлично работает, но я не могу портить структуру таблицы. Есть ли способ сделать это с помощью таблицы temp, которая может быть создана, когда представление запускается и отбрасывается потом? – richardterris

+0

А, я вижу, что ты сделал ... блестяще, спасибо большое! – richardterris