Может потребоваться несколько итераций, но вот пример, из которого вы можете построить.Вы можете СУММУ результаты выборочно на основе диапазонов дат для текущего года и предыдущего года , без выполнения подзапроса.Немного проще для чтения и может работать лучше.
Предполагается, что [GP_DATEPIECE] является столбцом даты или даты и времени.
DECLARE @StartDate date = '1/1/2019'
DECLARE @EndDate date = '4/30/2019'
DECLARE @StartDatePreviousYear date = DATEADD(YEAR, -1, @StartDate)
DECLARE @EndDatePreviousYear date = DATEADD(YEAR, -1, @EndDate)
SELECT
DATENAME(month, [GL_DATEPIECE]) AS [MONTH]
,[et_region] AS [REGION]
,[e].[et_etablissement] AS [STORE CODE]
,[et_libelle] AS [STORE NAME]
,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA]
,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDatePreviousYear AND @EndDatePreviousYear THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA_AN]
,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN 1 ELSE 0 END) AS [CurrentYearItemCount]
,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDatePreviousYear AND @EndDatePreviousYear THEN 1 ELSE 0 END) AS [PreviousYearItemCount]
FROM [piece]
LEFT OUTER JOIN [etabliss] AS [e] ON [piece].[gp_etablissement] = [e].[et_etablissement]
GROUP BY
DATENAME(month, [GL_DATEPIECE])
,[et_region]
,[et_etablissement]
,[et_libelle]
ORDER BY
[et_region] ASC
,[et_etablissement] ASC