Может быть, это поможет:
Сначала создайте несколько тестовых данных:
CREATE TABLE tblPoints ([User] VARCHAR(100), [Year] INT,Points INT,Value INT)
INSERT INTO tblPoints
SELECT 'A',1997,1,10 UNION ALL
SELECT 'A',1997,2,30 UNION ALL
SELECT 'A',1997,3,40 UNION ALL
SELECT 'A',1999,1,70 UNION ALL
SELECT 'B',1993,1,7 UNION ALL
SELECT 'B',1993,3,4 UNION ALL
SELECT 'C',2001,1,10
Конкурирующие столбцы:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME('Points'+Points),
QUOTENAME('Points'+Points))
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY tblPoints.Points ORDER BY tblPoints.Points) AS RowNbr,
CAST(tblPoints.Points AS VARCHAR(5)) AS Points
FROM
tblPoints
) AS tbl
WHERE
tbl.RowNbr=1
Затем создайте динамический sql и выполните его:
DECLARE @query NVARCHAR(4000)=
N'SELECT
*
FROM
(
SELECT
tblPoints.[User],
tblPoints.[Year],
''Points''+CAST(tblPoints.Points AS VARCHAR(5)) AS Points,
tblPoints.Value
FROM
tblPoints
) AS p
PIVOT
(
SUM(Value) FOR Points IN('+@cols+')
) AS pvt
ORDER BY [User]'
EXECUTE(@query)
И потому, что я не хочу таблицу точек:
DROP TABLE tblPoints