0

我有一张这样的桌子:

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

我在查询中犯了什么错误?

4

1 回答 1

2

问题与 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;

它使用您的测试数据在我的实例上工作。

编辑:动态请求

我对动态 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;
于 2013-10-16T15:44:53.920 回答