找一家公司的员工任期

时间:2013-06-26 05:43:32

标签: sql sql-server-2008

我已经编写了以下查询,以便逐年获得员工任期。

IE中。按“不到1年”,“1 - 2年”,“2 - 3年”和“3年以上”分组。

为了实现这一目标,我将与员工end_date进行比较。

但与人员end_date比较时,我无法得到正确的结果。

我已粘贴下面的完整代码,但我得到的计数不正确。

一些工作超过2年的员工属于<1年专栏。

    DECLARE @Project_Id Varchar(10)='ITS-004275';

With Cte_Dates(Period,End_date,Start_date,Project_Id)
As
(
SELECT '<1 Year' AS Period, GETDATE() AS End_Date,DATEADD(YY,-1,GETDATE()) AS Start_date,@Project_Id AS Project_Id
UNION
SELECT '1-2 Years', DATEADD(YY,-1,GETDATE()),DATEADD(YY,-2,GETDATE()),@Project_Id
UNION
SELECT '2-3 Years', DATEADD(YY,-2,GETDATE()),DATEADD(YY,-3,GETDATE()),@Project_Id
UNION
SELECT '>3 Years', DATEADD(YY,-3,GETDATE()),'',@Project_Id
),

--select * from Cte_Dates
--ORDER BY Start_date DESC


Cte_Staffing(PROJECT_ID,EMP_ID,END_DATE) AS
(
SELECT FK_Project_ID,EMP_ID,MAX(End_Date)AS END_DATE FROM DP_Project_Staffing
WHERE FK_Project_ID=@Project_Id
GROUP BY FK_Project_ID,Emp_ID
)



SELECT D.PROJECT_ID,D.Start_date,D.End_date,COUNT(S.EMP_ID) AS Count,D.Period
FROM Cte_Staffing S
RIGHT JOIN Cte_Dates D
ON D.Project_Id=S.PROJECT_ID
AND S.END_DATE<D.End_date AND S.END_DATE>D.Start_date
GROUP BY D.PROJECT_ID,D.Start_date,D.End_date,D.Period

4 个答案:

答案 0 :(得分:0)

我认为this将解决问题

正如您所看到的,您应该使用如下:

DATEADD(year, -1, GETDATE())

您还应该将GETDATE()设为参数

答案 1 :(得分:0)

我发现你的查询逻辑有点乱。为什么不直接计算每个员工的总时间并使用CASE子句?如果您给我DP_Project_Staffing表结构,我可以帮助您使用代码。你有begin_date字段吗?

答案 2 :(得分:0)

您正在参加CTE人员配置表的MAX(End_date)。在这种情况下,当员工有多个条目时,只会应用最新的条目。您想要使用MIN

像这样:

Cte_Staffing(PROJECT_ID,EMP_ID,END_DATE) AS
(
SELECT FK_Project_ID, EMP_ID, MIN(End_Date)AS END_DATE 
  FROM DP_Project_Staffing
...

重新阅读您的问题,您可能不希望人员end_date进行任期计算;你想使用start_date。 (或者在DP_Project_Staffing

中调用任何列

我还会将WHERE / JOIN子句更改为包含在其中一方,因此您有

AND S.END_DATE <= D.End_date AND S.END_DATE > D.Start_date

AND S.END_DATE < D.End_date AND S.END_DATE >= D.Start_date

由于您在日期比较中使用毫秒,因此在这种情况下不会有任何区别。但是,如果您将粒度更改为仅更新的日期,那么您将丢失员工在1年,2年等之前开始的所有记录。

答案 3 :(得分:0)

SELECT FK_Project_ID,E.Emp_ID,MIN(Start_Date) AS Emp_Start_Date ,MAX(End_Date) AS Emp_End_Date,
    E.Competency,E.First_Name+' '+E.Last_Name+' ('+E.Emp_Id+')' as Name,'Period'=
        CASE 
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=12 THEN '<1 Year'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>12 AND DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=24 THEN '1-2 Years'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>24 AND DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=36 THEN '2-3 Years'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>36 THEN '>3 Years'
        ELSE 'NA'
        END  
    FROM DP_Project_Staffing PS
    LEFT OUTER JOIN DP_Ext_Emp_Master E 
        ON E.Emp_Id=PS.Emp_ID
    WHERE FK_Project_ID=@PROJ_ID
    GROUP BY FK_Project_ID,E.Emp_ID,E.Competency,First_Name,Last_Name