[英]Count with union all
員工每周最多參與3個項目,在每個項目中,員工可以執行2個不同的任務。 我正在使用union all來連接單個表中的單獨字段,因此我為每個執行的任務獲得了一個單獨的行(每個員工最多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表中的當前值 上述查詢的當前輸出
我應該添加 - 所需的輸出與第二個圖像(上圖)相同,但有一個名為LineCount的額外列
LineCount
5
5
5
5
5
2
2
1
2
2
這是你想要的?
我添加了COUNT(*) OVER (PARTITION BY SAGEID, A.EmployeeID) AS RC
並修改了UNION ALL,因為Jean也建議
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.