SQL-запрос обновляет ранжирование на основе процентного распределения - PullRequest
0 голосов
/ 03 декабря 2010

Общее количество сотрудников: 10

Рейтинг, который будет распределен: 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) 

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

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

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Использование функции 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 голосов
/ 03 декабря 2010

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

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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...