2013-04-11 2 views
1

J'ai un employé de table, un autre service de table et une table relationnelle:Cross Rejoignez Répartition des données

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 

Je veux faire une requête dynamique pour pouvoir distribuer dans ma table relationnelle même quantité d'employé chaque département, je sais que je peux utiliser cross join mais va mettre tous les employés dans chaque département. Je veux juste la distribution, par exemple 3 employés pour le compte et les 3 autres pour la finance, mais cette quantité pourrait changer. Merci

+0

Qu'est-ce que votre SGBD? –

+0

désolé, SQL Server 2008 – tbag

Répondre

1

C'était amusant, il semble fonctionner assez bien, les employés sont répartis au hasard dans chaque département:

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 

La condition

(RankEmployee + RankDepartment) % CountDepartment = 0 

récupérera une seule ligne pour chaque employé. Les rangs sont calculés aléatoirement avec OVER(ORDER BY NEWID()). See this answer for details.

SQLFiddle here.

+0

@tbag: Ajout d'un * commentaire * concernant cette solution. –

+0

question, si je remplace RANK() par ROW_NUMBER() OVER (ORDER BY EmployeeId) ne fait pas la même chose? la même chose pour le département – tbag

+0

ROW_NUMBER est une meilleure idée car elle assure que vous n'avez pas de trou dans la séquence. Les résultats devraient être différents pour chaque exécution car c'est aléatoire! –

0
declare @columns varchar(max)='',@str varchar(maX) = '',@columns1 varchar(max)='' 

select @columns = @columns+category+',' from piv group by category 
set @columns= left(@columns,len(@columns)-1) 

select @columns1 = @COLUMNS1+'ISNULL(['+category+'],0) AS ['+category+'],' from piv group by category 
set @columns1= left(@columns1,len(@columns1)-1) 



set @str = 
'select date,'[email protected]+' from 
(
    select date,category, amount as amounts from piv 
)res 
pivot 
(
    max(amounts) 
    for category in ('[email protected]+') 
)pv' 
--print @str 
exec(@str)