There is no need to do everything at the same time.
It's easier to get monthly values ββfirst
SELECT DATEADD(month, DATEDIFF(month, 0, Dt), 0) as FOM , Plant , Stock = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 1 ELSE 0 END) , Special = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 0 ELSE 1 END) FROM DS_POs GROUP BY Plant, DATEADD(month, DATEDIFF(month, 0, Dt), 0)
and using this as a base to get the last 12-month result with CROSS APPLY
WITH DS_POSM AS ( SELECT DATEADD(month, DATEDIFF(month, 0, Dt), 0) as FOM , Plant , Stock = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 1 ELSE 0 END) , Special = SUM(CASE WHEN LEFT(Upper(Material), 2) = 'ZZ' THEN 0 ELSE 1 END) FROM DS_POs GROUP BY Plant, DATEADD(month, DATEDIFF(month, 0, Dt), 0) ) SELECT Convert(char(6), FOM, 112) Period , Plant , Stock , Special , MonthTotal = Stock + Special , ly.[12Months] FROM DS_POSM a CROSS APPLY (SELECT Sum(Stock + Special) [12Months] FROM DS_POSM lastyear WHERE lastyear.FOM Between DateAdd(mm, -12, a.FOM) And a.FOM AND lastyear.Plant = a.Plant ) ly ORDER BY FOM, Plant
DATEADD(month, DATEDIFF(month, 0, Dt), 0) get the first day of the month Dt