从查询中的两行到1行的信息

时间:2011-01-04 11:04:25

标签: sql sql-server

我有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。

这可能吗?

由于

4 个答案:

答案 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/