1

私はまだ解決できていないこの問題を抱えています。簡単にするために、すべてのユーザーがプロジェクトごとに作業時間を入力する必要があるこの 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 人あたりの合計時間は次のようになります。従業員 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;

次に、プロジェクトごとに従業員の各ペアの共通時間を決定する必要があります。ゴードン・リノフが彼のコメントで示唆しているように、これはおそらく 2 回のうちの少ない方に設定するのが最適です。これには、次のようなクエリが必要です。

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 に答える