2017-02-10 80 views
2

我寫了一個查詢,它給了我兩欄 - 一欄是年份(範圍從1997到2017),另一欄是幾個月的員工任期。在這種情況下,AVG()函數的正確用法是什麼?

Select DATEPART(YEAR,Cast(USI.StartDate As Date)) AS Year, 
     DATEDIFF(MONTH,Cast(USI.StartDate As Date),Cast(USI.EndDate As Date)) AS TenureInMonths 
From UserWorkHistory  UWH 
Join Users    U On UWH.UserId = U.Id 
Join UserStoryItems  USI On U.Id = USI.UserId 
Join UserWorkHistoryTypes UWHT On UWH.UserWorkHistoryTypeId = UWHT.Id 
Where 
(
    U.Location Like '%Great Britain%' 
Or U.Location Like '%United Kingdom%' 
Or U.Location Like '%England%' 
Or U.Location Like '%UK%' 
Or U.Location Like '%U.K.%' 
) 
and UWHT.Id = 1 
And USI.UserStoryItemTypeId = 1 
And Cast(USI.StartDate As Date) > DateAdd(Year, -20, GetDate()) 
And 
(
    (
     UWH.Role NOT LIKE '%Contract%' 
    Or UWH.Role NOT LIKE '%Contractor%' 
    Or UWH.Role NOT LIKE '%Freelance%' 
    Or UWH.Role NOT LIKE '%Non-perm%' 
    Or UWH.Role NOT LIKE '%non-permanent%' 
    ) 
    Or 
    (
     USI.Title NOT LIKE '%Contract%' 
    Or USI.Title NOT LIKE '%Contractor%' 
    Or USI.Title NOT LIKE '%Freelance%' 
    Or USI.Title NOT LIKE '%Non-perm%' 
    Or USI.Title NOT LIKE '%non-permanent%' 
    Or USI.Title NOT LIKE '%self-made%' 
    Or USI.Title NOT LIKE '%(Contract)%' 
    ) 
) 
GROUP BY DATEPART(YEAR,Cast(USI.StartDate As Date)), Cast(USI.StartDate As Date), Cast(USI.EndDate As Date)  
ORDER BY DATEPART(YEAR,Cast(USI.StartDate As Date)) 

我想要做的是根據他們開始的年份找到每名員工的平均任期。例如,1997年開始的員工的平均任職期限爲012年,而不是2012年。

我明白這一點,需要使用AVG()函數,但我不確定如何使用所有而不僅僅是加入

AVG(DATEDIFF(MONTH,Cast(USI.StartDate As Date),Cast(USI.EndDate As Date))) AS AVERAGE 

這不會給我每年的平均值。

我也明白GROUP BY子句在這裏是必要的,但是我不能只在GROUP BY BY YEAR中,因爲需要包含Cast(USI.StartDate As Date),Cast(USI.EndDate As Date) 。

+0

腳本中原本腳本中的'group by'是否是必需的? – iamdave

+0

是的,沒有任何額外的GROUP BY CAST STARTDATE和CAST ENDDATE,我收到錯誤消息,說我需要包含它們。我猜想一個選項是在查詢中找到合適的位置並刪除它,因此只能GROUP BY Year。然而,我找不到在哪裏... – BadAtCoding

+0

我不是說'額外'羣'做'平均',我的意思是那些已經在你提供的腳本,這不會做任何聚合。 – iamdave

回答

4

這是非常棘手沒有原始數據可用於調試,但你有沒有嘗試過更換:

DATEDIFF(MONTH,Cast(USI.StartDate As Date),Cast(USI.EndDate As Date)) AS TenureInMonths 

的東西,如:

DATEDIFF(MONTH,Min(Cast(USI.StartDate As Date)),Max(Cast(USI.EndDate As Date))) AS TenureInMonths 

這將允許你刪除的開始和結束日期來自GROUP BY?

+0

就像我說的,非常困難,因爲我們不知道數據是什麼,也不完全知道你想要達到的目標。 – Matthew

+1

謝謝@Matthew - 工作!對不起,我沒有問,我仍然是新手。但你的建議完美地工作。 – BadAtCoding

+0

@BadAtCoding很好聽!我很高興得到了幫助。 – Matthew

相關問題