我写了一个查询,它给了我两栏 - 一栏是年份(范围从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