Перекрестное соединение разделения данных

У меня есть таблица Employee, другая таблица Department и реляционная таблица:

Employee Table
id  Name
1   A
2   B
3   C
4   D
5   E
6   F

Department Table
id  Name
1   Accounting
2   Finance

Relation Table
id   EmployeeId   DepartmentId

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


person tbag    schedule 11.04.2013    source источник
comment
извините, SQL Server 2008   -  person tbag    schedule 11.04.2013


Ответы (1)


Это было весело, кажется, работает довольно хорошо, сотрудники распределяются случайным образом в каждом отделе:

select EmployeeId, DepartmentId
from 
(  select 
    ROW_NUMBER() OVER(ORDER BY NEWID()) as RankEmployee
  , Id as EmployeeId
    from Employee
 ) e , 
(  select 
    ROW_NUMBER() OVER(ORDER BY NEWID()) as RankDepartment
  , (select count(1) from Department) as CountDepartment
  , Id as DepartmentId
    from Department
 ) d
where (RankEmployee + RankDepartment) % CountDepartment = 0

Условие

(RankEmployee + RankDepartment) % CountDepartment = 0

будет получать только одну строку для каждого сотрудника.
А ранги вычисляются случайным образом с помощью OVER(ORDER BY NEWID()). Подробности см. в этом ответе.

SQLFiddle здесь.

person Cyril Gandon    schedule 11.04.2013
comment
@tbag: добавлен комментарий относительно этого решения. - person Bogdan Sahlean; 11.04.2013
comment
вопрос, если я заменю RANK() на ROW_NUMBER() OVER(ORDER BY EmployeeId) не будет так же? то же самое для отдела - person tbag; 11.04.2013
comment
ROW_NUMBER — лучшая идея, так как она гарантирует отсутствие пробелов в последовательности. Результаты должны быть разными для каждого выполнения, так как это случайно! - person Cyril Gandon; 12.04.2013