2017-02-10 49 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

相关问题