Вы можете использовать динамический PIVOT для достижения результата.
Поскольку табличные переменные изолированы от области действия динамического SQL, они не видны внутри динамического SQL. Поэтому я использовал временные таблицы (у них разные правила видимости). Обратите внимание, что в этом случае также можно использовать переменную таблицы, но я предпочитаю использовать временные таблицы.
CREATE TABLE #Names (ID INT,Name VARCHAR(MAX))
CREATE TABLE #PersonInfo (ID INT,NameID INT,Subject VARCHAR(100),Marks FLOAT)
INSERT INTO #Names VALUES (1,'Paul');
INSERT INTO #Names VALUES (2,'John');
INSERT INTO #Names VALUES (3,'Tayler');
INSERT INTO #PersonInfo VALUES (1,1,'Maths',95.34);
INSERT INTO #PersonInfo VALUES (2,2,'Science',32.12);
INSERT INTO #PersonInfo VALUES (3,3,'History',23.21);
INSERT INTO #PersonInfo VALUES (4,2,'Maths',32.4);
INSERT INTO #PersonInfo VALUES (5,3,'Science',60.34);
INSERT INTO #PersonInfo VALUES (6,1,'Music',60.23);
DECLARE @DynamicCols NVARCHAR(MAX) = '';
DECLARE @pvt NVARCHAR(MAX) = '';
DECLARE @SQLQuery NVARCHAR(MAX) = '';
SELECT @DynamicCols += ', SUM(' +QUOTENAME([Name])+') AS '+[Name] FROM #Names;
SET @DynamicCols = STUFF(@DynamicCols,1,1,'')
SELECT @pvt += ', ' +QUOTENAME([Name]) FROM #Names;
SET @pvt = STUFF(@pvt,1,1,'')
EXEC ('
SELECT [Subject],' + @DynamicCols+'
FROM (SELECT [NameID], [Subject], [Marks] FROM #PersonInfo) a
INNER JOIN #Names b ON a.NameID = b.ID
PIVOT
(
SUM([Marks])
FOR [Name] IN ('+ @pvt+')
) PIV
GROUP BY [Subject]');