2010-12-03 2 views
0

Общее количество сотрудников: 10SQL запрос обновления рейтинга на основе процентного распределения

Рейтинг Распределить: O, E, G

Процент выделяемого для каждого ранга: 20%, 40% , 40%

(пример:

1. total emp * 20/100 
select 10 * 20./100 = 2 
First 2 employees rank to be 'O' 
2. balance emp count * 40./100 
select 8 * 40./100 = 3 
Next 3 employees Rank to be 'E' 
3. Balance 5 Employees Rank to be 'G' 

Мы должны выделяемой ранг от порядка сотрудников по убыванию оценка

Create Table Ranking(Rank nvarchar,percentage int) 
insert into Ranking values('O',20) 
insert into Ranking values('E',40) 
insert into Ranking values('G',40) 

Create Table Emp(Empcode nvarchar(3),Score numeric,Ranking nvarchar) 
insert into Emp values('E1',97,null) 
insert into Emp values('E2',95,null) 
insert into Emp values('E3',87,null) 
insert into Emp Values('E4',85,null) 
insert into Emp Values('E5',78,null) 
insert into Emp Values('E6',75,null) 
insert into Emp Values('E7',68,null) 
insert into Emp Values('E8',65,null) 
insert into Emp Values('E9',59,null) 
insert into Emp Values('E10',58,null) 

рейтинг должен быть allcoated на основе процентной доли имеющихся в таблице Рейтинг

Теперь E1 и E2 сотрудники попадают в ранг «O» E3, E4, сотрудники E5 попадают в ранг «E» E6 , E7, E8, E9, E10 попадают в разряд 'G'

+0

Не знаете, что вы здесь задаете. Кроме того, вы можете редактировать сообщение и форматировать код с помощью кнопки формата кода. Благодарю. – 2010-12-03 10:54:34

+0

Это не рейтинг сотрудников на 20%, 40%, 40%, потому что ваш второй расчет занимает 40% оставшихся 80%. Чистый раскол 20/40/40, очевидно, разделил бы сотрудников на 2/4/4 группы. – 2010-12-03 11:25:36

+0

, вы имеете в виду, что я сразу обновляю ранг для первых 2 сотрудников как «O» – Girija 2010-12-03 12:03:41

ответ

1

Использование функции NTILE должно дать вам именно то, что вам нужно. Как это?

SELECT Empcode 
    , Score 
    , Ranking = CASE WHEN Band BETWEEN 1 AND 2 THEN 'O' 
        WHEN Band BETWEEN 3 and 6 THEN 'E' 
        WHEN Band > 6 THEN 'G' 
        ELSE '' END 
FROM (SELECT *, Band = NTILE(10) over (order by score DESC) 
     FROM EMP) qq 
0

Как насчет запуска трех обновленных запросов для достижения вашей цели? Такое решение принять во внимание, что вы будете иметь больше сотрудников в будущем, и что вы будете процент для каждого ранга:

update #Emp set Ranking = 'O' 
where Empcode in 
(
    select top(((select count('x') from #Emp where Ranking is null) * (select (percentage) from #Ranking where Rank = 'O'))/100) Empcode 
    from #Emp 
    where Ranking is null 
    order by Score desc 
); 

update #Emp set Ranking = 'E' 
where Empcode in 
(
    select top(((select count('x') from #Emp where Ranking is null) * (select (percentage) from #Ranking where Rank = 'E'))/100) Empcode 
    from #Emp 
    where Ranking is null 
    order by Score desc 
); 

update #Emp set Ranking = 'G' 
where Ranking is null; 

Это трудно придумать с чистым запросом на обновление данного ваши требований. Большую часть времени я стараюсь избегать использования курсора; но для размещения растущего списка ранжирования в будущем я должен использовать курсор. Для того, чтобы курсор работу, я должен добавить столбец [ID] в таблицу рейтинга:

Create Table #Ranking(id int, Rank nvarchar,Percentage int) 
insert into #Ranking values(1, 'O',20) 
insert into #Ranking values(2, 'E',40) 
insert into #Ranking values(3, 'G',40) 

Create Table #Emp(Empcode nvarchar(3),Score numeric,Ranking nvarchar) 
insert into #Emp values('E1',97,null) 
insert into #Emp values('E2',95,null) 
insert into #Emp values('E3',87,null) 
insert into #Emp Values('E4',85,null) 
insert into #Emp Values('E5',78,null) 
insert into #Emp Values('E6',75,null) 
insert into #Emp Values('E7',68,null) 
insert into #Emp Values('E8',65,null) 
insert into #Emp Values('E9',59,null) 
insert into #Emp Values('E10',58,null) 

Вот переписанный запрос на обновление с помощью курсора:

declare Ranking_Cursor cursor for 
    select Rank, percentage 
    from #Ranking 
    order by id asc 

declare @Rank as nvarchar 
declare @Percentage as int 

open Ranking_Cursor 
fetch next from Ranking_Cursor into @Rank, @Percentage 
while @@fetch_status = 0 
begin 
    update #Emp set Ranking = @Rank 
    where Empcode in 
    (
     select top(((select count('x') from #Emp where Ranking is null) * @Percentage)/100) Empcode 
     from #Emp 
     where Ranking is null 
     order by Score desc 
    ) 

    fetch next from Ranking_Cursor into @Rank, @Percentage 
end 
close Ranking_Cursor 
deallocate Ranking_Cursor 

--catch-all query for the bottom rank 
update #Emp set Ranking = @Rank 
where Ranking is null; 

Не очень, но это должен работать, если вы планируете добавить больше записей в таблицу Ranking. Я надеюсь, что кто-то еще может придумать более чистый запрос на обновление.

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