我寫了一個查詢,它給了我兩欄 - 一欄是年份(範圍從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) 。
腳本中原本腳本中的'group by'是否是必需的? – iamdave
是的,沒有任何額外的GROUP BY CAST STARTDATE和CAST ENDDATE,我收到錯誤消息,說我需要包含它們。我猜想一個選項是在查詢中找到合適的位置並刪除它,因此只能GROUP BY Year。然而,我找不到在哪裏... – BadAtCoding
我不是說'額外'羣'做'平均',我的意思是那些已經在你提供的腳本,這不會做任何聚合。 – iamdave