PIVOT в таблице SQL

У меня есть таблица вроде этого:

Value Name

ProjectA ProjectName
10/10/2012 StartDate
10/10/2013 EndDate
ProjectB ProjectName
11/11/2012 StartDate
11/11/2013 EndDate
ProjectC ProjectName
12/12/2012 StartDate
12/12/2013 EndDate

Мне нужно изменить таблицу на:

Project Name Start Date End Date

ProjectA 10/10/2012 10/10/2013 
ProjectB 11/11/2012 11/11/2013 
ProjectC 12/12/2012 12/12/2013

Я использовал следующий запрос для достижения моего результата,

select * from Project 
pivot
(
max(Value)
for[Name] in ([Project Name],[Start Date],[End Date])
)piv

Как только я выполню это, я просто получаю результат как:

Project Name Start Date End Date

 Project C 12/12/2012 12/12/2013

Какую ошибку я сделал в своем запросе?

1 ответ

Проблема связана с Max (Value), она вернет только самое высокое значение, Pivot не предназначен для выполнения неагрегационных значений.

Однако это должно решить вашу проблему.

WITH CTE(Value, Name,RID)
 AS
 (
 SELECT Value, Name, ROW_NUMBER() OVER (PARTITION BY (Name)ORDER BY Value) AS RID FROM YOURTABLE --Replace 
 )
 SELECT [ProjectName],[StartDate],[EndDate]
 FROM
 (SELECT Value,Name,RID
 FROM CTE)C
 PIVOT
 (
 max(Value)
 FOR Name IN ([ProjectName],[StartDate],[EndDate])
 ) AS PivotTable;

Он работал над моим экземпляром здесь с вашими тестовыми данными.

Изменение: динамический запрос

Я не так хорош в Dynamic SQL, и я не могу правильно получить столбцы, хотя это связано с тем, как он группирует имена столбцов в порядке desc.

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N'' + QUOTENAME(Name) + ', '
 FROM TestTable
 GROUP BY Name

Set @columns = LEFT(@Columns,Len(@Columns) -1)
Print @columns

SET @sql = N'
WITH CTE(Value, Name,RID)
AS
(
SELECT Value, Name, ROW_NUMBER() OVER (PARTITION BY (Name) ORDER BY Value) AS RID FROM TestTable
) 
SELECT ' + @columns + '
FROM
(SELECT Value,Name,RID
FROM CTE)C
PIVOT
(
max(Value)
FOR Name IN (' + @columns + ' )
) AS PivotTable;';
PRINT @sql;
EXEC sp_executesql @sql;

licensed under cc by-sa 3.0 with attribution.