2013-11-15 75 views
0

我有員工在數據庫中有合同。我想知道員工是否是某個地點的新員工。我有以下數據結構:確定員工是新員工還是離職員工

EmployeeId Index BeginDate Enddate  HoursToWork LocationId 
12133   1  2013-01-01 2014-01-01 10   1 
12133   2  2013-06-01 2014-01-01 20   1 
12133   3  2012-01-01 2014-01-01 5    1 

正如你所看到的,員工可以對一個位置超過1周的合同。那麼Endate可以爲null。

每個位置和每月或每季度我想查看有多少員工已啓動。我想爲我想要的數據使用@Startdate和@Enddate參數。

我應該考慮很多情況。一樣,索引字段並不總是一起BEGINDATE增加,就像你可以看到指數= 3

例子:

我想知道有多少員工在2013年一月

啓動在這種情況下,沒有什麼因爲第一份合同在2012年1月1日開始。有兩個新合同,但該員工對該位置不是新手。但如果索引3不存在,那麼whis應該是一個新員工。

可能員工有兩份合同在同一天開始,如果他沒有合同,那麼它是1名新員工。

我已經嘗試了以下方法,當員工只有1份合同時,該方法起作用。但是,如果有超過1周的合同那麼就很難確定,如果員工是新的:

declare @Startdate datetime set @Startdate = '2013-01-01' 
declare @Enddate datetime set @Enddate = '2013-12-31' 

select EmployeeId, Index, BeginDate, Enddate, HoursToWork, LocationId 
,(case 
     when BeginDate between @Startdate and @Enddate then 1 
end) as NewEmployee 
,(case 
     when Enddate between @Startdate and @Enddate then 1 
end) as LeavingEmployee 

from Contracts 

鑑於3條記錄,該員工是不是一個新員工。我想有這樣一個輸出:

LocationId NewEmployee 
    1   0 

當我剛剛有第2條記錄,我想知道在Janury 2013名新員工,然後我想到:

LocationId NewEmployee 
    1   1 
+0

所以,無論如何,你將不得不使用上'BeginDate'一個'Min'(或等價的東西)。現在離職員工,你不介意他們在第一個合同之後是否有另一份合同?你可以用你的3行顯示你想要檢索的信息嗎? –

+0

@RaphaëlAlthaus查看編輯,所需的輸出。 – Amedo

回答

1

如何像這樣的開始員工?

SELECT EmployeeID, LocationID, Min(StartDate) 
    FROM Contracts 
GROUP BY EmployeeID, LocationID 
HAVING Min(StartDate) between @Startdate and @Enddate 

我會建議爲Leavingemployee類似的東西,但我不會花太多的精力試圖讓那些進入一個查詢。看起來它們在功能上有所不同。

編輯:es,它應該是最小值,不是最大值。至於什麼是需要的,我讀了「我想看看有多少員工開始工作」,而且我沒有看到太多的理由使事情複雜化。 如果需要額外的數據,它總是可以移動到一個子查詢並選擇* where ...在子查詢中,但如果它不需要...

爲了只處理活動合同我們可以設置以下規則: 在我們正在查看的期間,如果其開始日期爲<參數結束日期它的結束日期>參數開始日期,則合同在某處處於活動狀態。

並稱,我們的查詢,我們得到

SELECT EmployeeID, LocationID, Min(StartDate) 
    FROM Contracts 
WHERE Startdate <= @Enddate 
    AND Enddate >= @Startdate 
GROUP BY EmployeeID, LocationID 
HAVING Min(StartDate) between @Startdate and @Enddate 
+0

1.他似乎需要Enddate和HoursToWork。你似乎忘記了這一點,讓事情變得更容易2.它應該是Min,而不是Max,不是? –

+0

@oerkelens:如果員工在2012年1月1日啓動,這不起作用。因爲在那種情況下,他不是新員工。 – Amedo

+0

@Amedo:這就是爲什麼它被改爲MIN。由於2012-01-01不會落入你的範圍,他不會被選爲新員工。 – oerkelens