2017-02-13 3 views
0

Ich habe eine Tabelle "Mitarbeiter"T-SQL- erhalten Mitarbeiter Start- und Enddaten auf jährlicher Basis

Mitarbeiter Tabellen genannt hat unter Spalten

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 

Frage:

Employee-Tabelle hat unter Zeilen Daten.

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 

Nach oben Tabellenzeile Wert ergeben soll, wie unten auf meiner Anfrage

TheYear - EmployeeCountPerYear 

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

jedoch sein, wenn ich meine Abfrage ausführen kann ich nicht sehen, das Ergebnis als above.I nicht sicher ist ich das sagen kann, Problem aber ich versuche, alle Mitarbeiter arbeiten begonnen Datum und Ended Datum von Jahr zu Jahr .Any Hilfe appreated.Thank Sie werden zu finden.

Antwort

3

Sie können OUTER APPLY versuchen:

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 dafür. Und die Ergebnisse sind:

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