SELECT 'X'+cast(A.NUMBER AS VARCHAR(10)) X,'Y'+cast(B.NUMBER AS VARCHAR(10)) Y,CAST(A.NUMBER AS VARCHAR(10))+'*'+CAST((CASE WHEN B.NUMBER<A.NUMBER THEN NULL ELSE B.NUMBER END) AS VARCHAR(10))+'='+ CAST(A.NUMBER*(CASE WHEN B.NUMBER<A.NUMBER THEN NULL ELSE B.NUMBER END) AS VARCHAR(10)) C INTO #1
FROM (SELECT NUMBER FROM [master]..SPT_VALUES WHERE TYPE='P' AND NUMBER BETWEEN 1 AND 9) A
LEFT JOIN (SELECT NUMBER FROM [master]..SPT_VALUES WHERE TYPE='P' AND NUMBER BETWEEN 1 AND 9) B ON A.NUMBER<B.NUMBER+1
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + X from #1 group by X
exec ('select * from #1 a pivot (MAX(C) for X in (' + @sql + ')) b')