我已经编写了以下查询,以便逐年获得员工任期。
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
答案 0 :(得分:0)
答案 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