I hope this will help you. You just need to complete the rest of the months with Copy-Paste-Replace.
WITH CTE AS(
SELECT TOP 12 DATEADD( mm, (ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1) * -1, DATEADD( mm, DATEDIFF( mm, 0, GETDATE()), 0)) period
FROM sys.all_columns
),
Data AS(
SELECT period,
P.SPRSNSLN AS SPRSNSLN,
ISNULL( Cur.MonthlyGP, 0) MonthlyGP,
ISNULL( Cur.MonthlyRev, 0) MonthlyRev,
ISNULL( Cur.MonthlyGP, 0) - ISNULL( Prev.MonthlyGP, 0) AS MonthlyYOYGPDiff,
ROW_NUMBER() OVER( PARTITION BY P.SPRSNSLN ORDER BY period) MonthNo
FROM CTE
CROSS
JOIN (SELECT DISTINCT SPRSNSLN
FROM GPByMonth) P
LEFT
JOIN GPByMonth Cur ON Cur.M = MONTH( period)
AND Cur.Y = YEAR( Period)
AND P.SPRSNSLN = Cur.SPRSNSLN
LEFT
JOIN GPByMonth Prev ON Prev.M = MONTH( period)
AND Prev.Y = YEAR( Period) - 1
AND P.SPRSNSLN = Prev.SPRSNSLN
)
SELECT SPRSNSLN,
MAX( CASE WHEN MonthNo = 1 THEN period END) AS GPDate_CY1,
MAX( CASE WHEN MonthNo = 1 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY1,
SUM( CASE WHEN MonthNo = 1 THEN MonthlyGP END) AS MonthlyGP_1,
SUM( CASE WHEN MonthNo = 1 THEN MonthlyRev END) AS MonthlyRev_1,
SUM( CASE WHEN MonthNo = 1 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_1,
MAX( CASE WHEN MonthNo = 2 THEN period END) AS GPDate_CY2,
MAX( CASE WHEN MonthNo = 2 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY2,
SUM( CASE WHEN MonthNo = 2 THEN MonthlyGP END) AS MonthlyGP_2,
SUM( CASE WHEN MonthNo = 2 THEN MonthlyRev END) AS MonthlyRev_2,
SUM( CASE WHEN MonthNo = 2 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_2,
MAX( CASE WHEN MonthNo = 3 THEN period END) AS GPDate_CY3,
MAX( CASE WHEN MonthNo = 3 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY3,
SUM( CASE WHEN MonthNo = 3 THEN MonthlyGP END) AS MonthlyGP_3,
SUM( CASE WHEN MonthNo = 3 THEN MonthlyRev END) AS MonthlyRev_3,
SUM( CASE WHEN MonthNo = 3 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_3
FROM Data
GROUP BY SPRSNSLN
ORDER BY SPRSNSLN