2013-06-26 2 views
1

Я написал следующий запрос, чтобы получить срок пребывания сотрудников в год.Найти сотрудника для компании

Т.е. сгруппированы «менее 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 [email protected]_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

я обязательно на основе текущей даты, дай мне START_DATE по END_DATE для следующих условий: - <1 год, 1-2 года, 2-3 года, <3 – Puskar

+1

года я сделать> 3-х лет NULL, а не '' и использовать это в своем предложении where. –

ответ

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 [email protected]_ID 
    GROUP BY FK_Project_ID,E.Emp_ID,E.Competency,First_Name,Last_Name 
+0

правильный ответ ... используя регистр case, я только получил его. – Puskar

+0

Спасибо всем за ценное предложение и коды. – Puskar

0

я думаю this решит проблему

, как вы можете видеть, вы должны использовать, как это:

DATEADD(year, -1, GETDATE()) 

вы должны также получить GETDATE() параметру

+0

Спасибо Liran ...но мне нужен точный запрос – Puskar

+0

Я не могу определить – Puskar

+0

Я уже использовал функцию dateadd, как вы предлагаете – Puskar

0

Я нахожу вашу логику запросов немного беспорядочной. Почему бы вам просто не вычислить общий период для каждого сотрудника и не использовать предложение CASE? Я могу помочь вам с кодом, если вы дадите мне структуру таблицы DP_Project_Staffing. У вас есть поле begin_date в нем?

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 

Поскольку вы используете miliseconds в сравнении даты, это не будет иметь никакого значения в этом случае. Однако, если вы измените детализацию только на дату, что будет иметь больше смысла, вы потеряете все записи, где работник начал ровно 1 год, 2 года и т. Д. Назад.

+0

Спасибо всем, мой подход был неправильным. – Puskar