1

我编写了以下查询来逐年获取员工任期。

IE。按“1 年以下”、“1-2 年”、“2-3 年”和“3 年以上”分组。

为了得到这个,我与员工进行比较end_date

但是与 staffed 比较时,我无法得到正确的结果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

4 回答 4

0

我认为将解决问题

如您所见,您应该使用如下:

DATEADD(year, -1, GETDATE())

你还应该得到GETDATE()一个参数

于 2013-06-26T05:48:36.867 回答
0

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

于 2013-06-26T08:03:33.517 回答
0

您正在MAX(End_date)使用 CTE 人员配置表。在这种情况下,当员工有多个条目时,只有最近的条目才会适用。你想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 年等之前开始的所有记录。

于 2013-06-26T08:15:09.030 回答
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
于 2013-06-26T09:47:45.400 回答