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.