1

我有这个问题,我还不能解决。为了简单起见,有一张表,所有用户都必须在其中输入每个项目的工作时间。

我的目标是找到所有这些年来项目中一起工作时间最长的员工。我对他们本身从事哪些项目不感兴趣,只对那些花费最多时间在一起的员工感兴趣。

为了澄清我必须使用的表格:

CREATE TABLE [dbo].[table-hours](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [projectid] [int] NOT NULL,
    [employeeid] [int] NOT NULL,
    [timediff] [float] NOT NULL,
 CONSTRAINT [PK_table-hours2] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

一些用于填充此表的示例数据:

insert into dbo.[table-hours] (projectid, employeeid, timediff) values (1,1,2.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (1,2,4.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (1,3,1.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (2,1,1.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (2,2,3.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (2,4,1.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (3,1,1.0)
insert into dbo.[table-hours] (projectid, employeeid, timediff) values (3,3,2.0)

在这种情况下,每位员工的总小时数应为:员工 1 总小时数 = 2+1+1,员工 2 总小时数 = 4+3,员工 3 总小时数 = 1+2,员工 4 总小时数 = 1

共享时间为:员工 1 和 2 共享时间 = 3,员工 2 和 3 共享时间 = 1,员工 1 和 3 共享时间 = 2,等等...

有谁知道如何实现这一点?

问候,约翰

4

1 回答 1

0

没有一个简单的答案,您基本上需要将表中的特定信息挖掘到一个临时表中,然后为您的问题提供答案。

您需要做的第一件事是识别所有可能的员工对。

如果此表中存在所有员工,则此逻辑将执行此操作:

CREATE TABLE EmpPairs (ID int identity(1,1) primary key, Emp1 int, Emp2 int);

INSERT EmpPairs (Emp1, Emp2)
SELECT a.EmployeeID, b.EmployeeID
FROM (SELECT Distinct EmployeeID FROM table-hours) a CROSS JOIN 
     (SELECT Distinct EmployeeID FROM table-hours) b
WHERE a.EmployeeID <> b.EmployeeID;

其次,您需要按项目确定每对员工的共同时间。正如 Gordon Linoff 在他的评论中所建议的那样,这可能最好设置为两次中较小的一次。为此,您需要一个类似的查询:

SELECT ep.ID 
  CASE WHEN a.TimeDiff < b.TimeDiff THEN a.TimeDiff ELSE b.TimeDiff END as [Time]
FROM table-hours a INNER JOIN table-hours b ON a.ProjectID = b.ProjectID
  INNER JOIN EmpPairs ep ON ((a.EmployeeID = ep.Emp1 and b.EmployeeID = ep.Emp2) OR
                             (b.EmployeeID = ep.Emp1 and a.EmployeeID = ep.Emp2))

从这里你可以得到你的答案:

SELECT Emp1, Emp2, Sum([Time]) as TotalTime
FROM ( 
    SELECT ep.Emp1, ep.Emp2, 
      CASE WHEN a.TimeDiff < b.TimeDiff THEN a.TimeDiff ELSE b.TimeDiff END as [Time]
    FROM table-hours a INNER JOIN table-hours b ON a.ProjectID = b.ProjectID
      INNER JOIN EmpPairs ep ON ((a.EmployeeID = ep.Emp1 and b.EmployeeID = ep.Emp2) OR
                                 (b.EmployeeID = ep.Emp1 and a.EmployeeID = ep.Emp2))
) x
GROUP BY Emp1, Emp2
ORDER BY Sum([Time]) DESC

如果您只想要(例如)前 10 名,请将其第一行更改为

SELECT TOP 10 Emp1, Emp2, Sum([Time]) as TotalTime
于 2013-11-07T22:22:58.440 回答