簡體   English   中英

與聯盟一起計算

[英]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表中的當前值 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM