Quelle est l'utilisation correcte de la fonction AVG () dans cette situation?

J'ai écrit une requête qui me donne deux colonnes – une colonne est Ans (allant de 1997 à 2017) et l'autre colonne est la durée d'un employé par mois.

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 '%UK%' ) 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)) 

Ce que je veux faire, c'est find la durée moyenne par employé en fonction de l'année où ils ont commencé. Par exemple, la durée moyenne en mois pour un employé qui a commencé en 1997 plutôt qu'en 2012.

Je comprends pour cela que la fonction AVG () doit être utilisée, mais je ne sais pas comment l'exécuter avec TOUTES les années dans la colonne de l'année, plutôt que d'append simplement

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

ce qui ne me donne pas la moyenne par an.

Je comprends aussi que la clause GROUP BY est nécessaire ici, mais je ne peux pas GROUP BY juste l'ANNÉE, comme Cast (USI.StartDate As Date), Cast (USI.EndDate As Date) doivent être inclus.

Il est très difficile de déboguer sans datatables d'origine disponibles, mais avez-vous essayé de replace:

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

avec quelque chose comme:

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

qui vous permettrait de supprimer les dates de début et de fin du GROUP BY?