Hello, try this query:
upd:
SELECT [xyz].[Name], [xyz].[Month], [xyz].[Number], sm.sub_total
FROM [xyz]
JOIN (SELECT [Name], [Month], [Number],
ROW_NUMBER() OVER(ORDER BY [xyz].[Name], [xyz].[Month]) AS pos
FROM [xyz] ) AS [xyzp]
ON [xyz].[Name] = [xyzp].[Name] AND
[xyz].[Month] = [xyzp].[Month] AND
[xyz].[Number] = [xyzp].[Number]
OUTER APPLY ( SELECT rn.[Name], [Month], SUM(rn.[Number]) AS sub_total
FROM ( SELECT ROW_NUMBER() OVER(ORDER BY [Name], [Month]) AS pos,
[Name], [Month], [Number]
FROM [xyz]
) AS rn
WHERE rn.[Name] = [xyz].[Name] AND
rn.[Month] = [xyz].[Month] AND
rn.pos <= [xyzp].pos
GROUP BY rn.[Name], rn.[Month] ) AS sm
The query would be simplier if to use 'grouping sets' clause, but it only available in MS SQL 2008 or higher.