2017-04-06 6 views
1

従業員は1週間に最大3つのプロジェクトに関わり、各プロジェクトでは2つの異なるタスクを実行できます。 私はunion allを使用して1つのテーブルから別々のフィールドに参加していますので、実行されたタスクごとに別々の行が表示されます(従業員1人あたり最大6行)。最終的にシステム内の時計に参加するので、各従業員に支払う金額を特定のプロジェクトのタスクに割り当てることができ、お金がどこにあるかをより正確に把握することができます。組合での集計すべて

私は分割する番号があるので、タスクの量を数えて(各従業員の行数を数える)手段が必要です。

私はいくつかの場所でグループを試してみましたが、1つしか表示されません(おそらく選択範囲内に一意のフィールドがないためです。

特定のフィールドでカウントを行うべきですか?または別の方法がありますか?

現在SQLクエリ

DECLARE @WeekCommencing date = '2017-04-03' 

select SageID, a.EmployeeID, a.ProjectID, a.TaskID, a.FlatRate, a.PayRate from 
( Select distinct Employee.SageID, EmployeeProject.EmployeeID, EmployeeProject.ProjectID, EmployeeProject.TaskID, Employee.FlatRate, Employee.PayRate from 
    ( Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID2 is not null 
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID2 is not null   
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID2 is not null  
    ) as EmployeeProject 

    inner join 
    Employee on EmployeeProject.EmployeeID = Employee.EmployeeID 
    where WeekCommencing = @WeekCommencing 
) as a 

inner join 

( Select ProjectEmployeeID, EmployeeID from -- remove duplicates if info is inserted multiple times 
    ( Select ProjectEmployeeID, EmployeeID, ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY ProjectEmployeeID DESC) EmployeeDup 
     FROM ProjectEmployee 
    ) a 
    WHERE EmployeeDup = 1 
) as c 

on a.EmployeeID = c.EmployeeID 

Order by a.flatrate, a.SageID 

ProjectEmployeeテーブルの電流値 Current Values in the ProjectEmployee table クエリCurrent Output from above query

上記から出力される電流Iは、追加する必要 - 所望の出力は、(上述した第2の画像と同じです)がありますが、LineCountという特別な列があります

LineCount 
5 
5 
5 
5 
5 
2 
2 
1 
2 
2 
+0

をしてください示唆したALLとUNIONを変更しました。 – jarlh

+0

なぜProjectID1がnullでなく、Project1TaskID1がnullであるか、およびProjectID1がnullではなくProject1TaskID1がnullでないクエリを持っていますか?そのシナリオのすべてのケースをカバーする「WHERE ProjectID1がnullでないクエリ」はありませんか? – Jens

+0

あなたがあなたのクエリでいくつかの組合を繰り返したと思う...さらに、いくつかのサンプルデータ(CREATEとINSERTスクリプト)を投稿すると非常に便利です – etsa

答えて

0

これはあなたが探しているものですか?

私はCOUNT(*) OVER (PARTITION BY SAGEID, A.EmployeeID) AS RC を追加し、ジャンがあまりにもhttps://stackoverflow.com/help/mcveを読んで、

DECLARE @WeekCommencing date = '2017-04-03' 

select SageID, a.EmployeeID, a.ProjectID, a.TaskID, a.FlatRate, a.PayRate, COUNT(*) OVER (PARTITION BY SAGEID, A.EmployeeID) AS RC 
from ( Select distinct Employee.SageID, EmployeeProject.EmployeeID, EmployeeProject.ProjectID, EmployeeProject.TaskID, Employee.FlatRate, Employee.PayRate 
     from (  
      Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID1 is not null 
       union all 
      Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID1 is not null and Project1TaskID2 is not null 
       union all 
      Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID2 is not null 
       union all 
      Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID2 is not null and Project2TaskID2 is not null   
       union all 
      Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID3 is not null 
       union all 
      Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID3 is not null and Project3TaskID2 is not null   
      ) AS EMPLOYEEPROJECT 
     INNER JOIN EMPLOYEE ON EMPLOYEEPROJECT.EMPLOYEEID = EMPLOYEE.EMPLOYEEID 
     WHERE WeekCommencing = @WeekCommencing 
    ) AS A 
INNER JOIN (SELECT ProjectEmployeeID, EmployeeID 
      from -- remove duplicates if info is inserted multiple times 
      ( Select ProjectEmployeeID, EmployeeID, ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY ProjectEmployeeID DESC) EmployeeDup 
       FROM ProjectEmployee 
      ) a 
      WHERE EmployeeDup = 1 
      ) AS C ON A.EMPLOYEEID = C.EMPLOYEEID  
Order by a.flatrate, a.SageID 
+0

数は、私が後にしたものです。あなたは組合のすべてについて何を意味するかを見て、誰かがプロジェクトに取り組み、1週間に1種類のタスクしか実行できない、または誰かがプロジェクトで作業して2種類のタスクを実行することはできますが、プロジェクトで作業することはできず、タスクを実行することもできません。 – hero9989

+0

UNIONジェンスが提案したように – etsa

関連する問題