2013-10-16 174 views
0

我有這樣的一個表: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 

我在查詢中犯了什麼錯誤?

回答

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好,我無法獲得列正確排序,雖然這僅僅是由於它的方式組倒序的列名。

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; 
+0

謝謝你Peter .. – Xavier

+0

如何爲動態列實現同樣的功能.. – Xavier