2013-04-11 113 views
1

的斯普利特我有一个Employee表,另一个表部和一个关系表:交叉连接数据

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名为财务分配,但这个数量可能会改变。 感谢

+0

什么是你的DBMS? – 2013-04-11 15:01:19

+0

对不起,SQL Server 2008 – tbag 2013-04-11 15:04:18

回答

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())See this answer for details.

SQLFiddle here.

+0

@tbag:添加了关于此解决方案的*评论*。 – 2013-04-11 19:26:39

+0

问题,如果我用ROW_NUMBER()OVER(ORDER BY EmployeeId)替换RANK()的方式不是这样吗?部门 – tbag 2013-04-11 19:35:51

+0

的ROW_NUMBER也是一个更好的主意,因为它确保您在序列中没有空白。每次执行的结果应该是不同的,因为它是随机的! – 2013-04-12 06:48:41

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)