Как насчет запуска трех запросов на обновление вместе для достижения вашей цели?В этом решении учитывается, что в будущем у вас будет больше сотрудников и процент для каждого ранга:
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;
Не красиво, но это должно работать, если вы планируете добавить больше записей в таблицу ранжирования.Я надеюсь, что кто-то еще может предложить более чистый запрос на обновление.