T-Sql每年获取员工的开始和结束日期

T-Sql每年获取员工的开始和结束日期,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张名为“雇员”的表格 Employee表包含以下列 Id (Identity) EmploymentStartDate (datetime), EmploymentEndDate (nullable datetime) T-SQL查询 DECLARE @FromYear int, @ToYear int SELECT @FromYear = YEAR(MIN(EmploymentStartDate)), @ToYear = YEAR(GETDATE()) FROM Emp

我有一张名为“雇员”的表格

Employee表包含以下列

Id (Identity)
EmploymentStartDate (datetime),
EmploymentEndDate (nullable datetime)
T-SQL查询

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
根据上表行值,我的查询结果应如下所示

TheYear - EmployeeCountPerYear

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

但是,如果我运行我的查询,我看不到上述结果。我不确定我是否能说出问题所在,但我正在尝试逐年查找所有员工的工作开始日期和结束日期。。将通知任何帮助。谢谢。

您可以尝试
外部应用

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;

您可以尝试外部应用:

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;
╔═════════╦═════════════════════╗
║ TheYear ║ EmploymentStartDate ║
╠═════════╬═════════════════════╣
║    2012 ║                   1 ║
║    2013 ║                   1 ║
║    2014 ║                   2 ║
║    2015 ║                   3 ║
║    2016 ║                   3 ║
║    2017 ║                   4 ║
╚═════════╩═════════════════════╝