我有3个数据库表:
Workoutput,定义员工完成的工作。 employeeinfo定义每个人的关系。三个重要的领域是孩子,父母和关系。可以列出一个人 有几次不同的关系,即
child parent relation
12 3 2
12 43 4
关系是指父母是导师还是经理
最后是一个标准的员工表,其中包含有关员工ID,姓名,登录等的全面列表。
我想有一个结果表,它每天定义一个工人上面的所有人,但是将它定义在一行中 以一天为周期。目前我只能通过以下查询在不同的日子定义它们。
SELECT workoutput.Day, workoutput.Employee, employee.name
FROM workoutput INNER JOIN
employeeInfo ON workoutput.ID = [employeeinfo].son INNER JOIN
[employee] ON [employeeInfo].parent = [employee].id INNER JOIN
[employee] AS [employee1] ON workoutput.[Employee ID] = [employee1].id
这会返回关系,但每天会有两行,因为大多数人都会有两个人(Mentor和Manager)。
29/03/2010 00:00:00 Employee1 Manager 3
29/03/2010 00:00:00 Employee1 Mentor 1
我希望
29/03/2010 00:00:00 Employee1 Mentor 1 Manager3
我还有另外一个表,它可以定义它有两行的关系,id和关系类型,id指的是employeeinfo表中定义的关系id。
这可能吗?
由于
答案 0 :(得分:1)
孩子的父母数量是否最多(即关系)?每个关系有一个吗?
如果是这样,您可以使用PIVOT执行此操作,以便从当前输出获得所需的输出。
但是,如果有一定数量的角色,您也可以从一开始就将其包含在您的联接中:
SELECT wo.Day, wo.Employee, e.name, er1.name, er2.name, etc.
FROM workoutput AS wo
INNER JOIN [employee] AS e
ON workoutput.[Employee ID] = e.id
LEFT JOIN employeeInfo AS ei1
ON e.ID = ei1.child
AND ei1.relation = 1
LEFT JOIN [employee] AS er1
ON ei1.parent = er1.id
LEFT JOIN employeeInfo AS ei2
ON e.ID = ei2.child
AND ei2.relation = 2
LEFT JOIN [employee] AS er2
ON ei2.parent = er2.id
等
答案 1 :(得分:0)
不使用标准SQL。这里通常的方法是对表进行排序,然后将其用作报表工具或自定义程序的输入。
在SQL Server中,可以编写执行此操作的存储过程。这取决于你想要多么糟糕。
答案 2 :(得分:0)
如果您的关系字段是常量(即只有一定数量的关系类型),您可以编写一个CASE语句来像这样转置它...
SELECT workoutput.Day, workoutput.Employee,
CASE relation WHEN 2 THEN employee.name END AS relation2, CASE relation WHEN 4 THEN employee.name END AS relation4
FROM workoutput
INNER JOIN employeeInfo ON workoutput.ID = [employeeinfo].son
INNER JOIN [employee] ON [employeeInfo].parent = [employee].id
INNER JOIN [employee] AS [employee1] ON workoutput.[Employee ID] = [employee1].id
GROUP BY workoutput.Day, workoutput.Employee, employee.name
然而,一个相当明显的缺点是,如果你添加新的关系,那么你将开始获得重复的行,所以这只应该在你的SP或类似的
中有严格的版本控制时使用修改强> 道歉,我错过了GROUP BY条款:)
答案 3 :(得分:0)
您可以将员工标识符和group_concat
父母分组。
http://explainextended.com/2010/06/21/group_concat-in-sql-server/