2017-02-13 4 views
0

У меня есть таблица под названием "Employee"T-Sql получить Employees даты начала и окончания на ежегодной основе

таблицы Employee имеет под столбцами

Id (Identity) 
EmploymentStartDate (datetime), 
EmploymentEndDate (nullable datetime) 

T-SQL Query

DECLARE @FromYear int, @ToYear int 

SELECT @FromYear = YEAR(MIN(EmploymentStartDate)), 
     @ToYear = YEAR(GETDATE()) 
FROM Employee 

;WITH CTE AS 
(
    SELECT @FromYear As TheYear 
    UNION ALL 
    SELECT TheYear + 1 
    FROM CTE 
    WHERE TheYear < @ToYear 
) 

SELECT TheYear as [Year], 
     COUNT 
     (
     CASE WHEN TheYear <= YEAR(COALESCE(EmploymentEndDate, GETDATE())) THEN 
      1 
     END 
     ) As [EmployeeCountPerYear] 
FROM CTE 
INNER JOIN Employee ON(TheYear >= YEAR(EmploymentStartDate)) 
GROUP BY TheYear 

Вопрос:

Таблица служащих имеет данные строк.

Id - EmploymentStartDate - EmploymentEndDate 
1 - '2012-10-10'   - null 
2 - '2014-10-10'   - '2015-10-10' 
3 - '2015-10-10'   - null 
4 - '2016-10-10'   - null 
5 - '2017-10-10'   - null 

Согласно вышеприведенной таблице значения строк Результат должен быть, как показано ниже на мой запрос

TheYear - EmployeeCountPerYear 

2012 - 1 
2013 - 1 
2014 - 2 
2015 - 3 (Because EmploymentEndDate has one employee that worked in 2015) 
2016 - 3 
2017 - 4 

Однако, если я запускаю мой запрос я не могу видеть результат как above.I я не уверен, что я могу сказать проблема, но Я пытаюсь найти всех сотрудников. Дата начала работы и дата окончания года.. Любая помощь будет оказана. Спасибо.

ответ

3

Вы можете попробовать OUTER APPLY:

DECLARE @FromYear int, @ToYear int; 

SELECT @FromYear = YEAR(MIN(EmploymentStartDate)), 
     @ToYear = YEAR(GETDATE()) 
FROM Employee; 

WITH CTE AS 
(
    SELECT @FromYear As TheYear 
    UNION ALL 
    SELECT TheYear + 1 
    FROM CTE 
    WHERE TheYear < @ToYear 
) 
SELECT * 
FROM CTE A 
OUTER APPLY(SELECT COUNT(*) EmploymentStartDate 
      FROM dbo.Employee 
      WHERE A.TheYear 
      BETWEEN YEAR(EmploymentStartDate) AND YEAR(ISNULL(EmploymentEndDate,GETDATE()))) B; 

Here is a demo этого. И результаты:

╔═════════╦═════════════════════╗ 
║ TheYear ║ EmploymentStartDate ║ 
╠═════════╬═════════════════════╣ 
║ 2012 ║     1 ║ 
║ 2013 ║     1 ║ 
║ 2014 ║     2 ║ 
║ 2015 ║     3 ║ 
║ 2016 ║     3 ║ 
║ 2017 ║     4 ║ 
╚═════════╩═════════════════════╝