2014-11-20 54 views
0

我有一个SQL查询,我需要转换成PIVOT表。眼下数据显示为这样...需要协助PIVOT表

enter image description here

但我真的希望它出现与ProcessDesc作为列标题和“交叉点”是DateCompleted,如....

enter image description here

我该怎么做到这一点?创建原来的查询是如下查询...

SELECT DISTINCT E.DisplayName, EPM.DateCompleted, PS.SortNumber, PS.ProcessDesc 
FROM dbo.EPM 
    INNER JOIN dbo.PS 
    ON EPM.EPS = PS.ID 
    INNER JOIN dbo.E 
    ON EPM.ID = E.ID 
WHERE DisplayName IS NOT NULL 
ORDER BY E.DisplayName, PS.SortNumber 
+0

D你只需要4列或所有列? – Mihai 2014-11-20 23:22:50

+0

我不需要ProcessSort,只需要其他3. ProcessSort只是用于对ProcessDesc字段进行排序,这将成为主要的列标题。 @Mihai – WebDevGuy 2014-11-20 23:46:09

回答

0
SELECT E.DisplayName, 
MAX(CASE WHEN PS.ProcessDesc='Set-Up Form 1' THEN EPM.DateCompleted END) as [Set-Up Form 1], 
MAX(CASE WHEN PS.ProcessDesc='Set-Up Form 2' THEN EPM.DateCompleted END) as [Set-Up Form 2], 
MAX(CASE WHEN PS.ProcessDesc='Set-Up Form 3' THEN EPM.DateCompleted END) as [Set-Up Form 3] 
FROM dbo.EPM 
    INNER JOIN dbo.PS 
    ON EPM.EPS = PS.ID 
    INNER JOIN dbo.E 
    ON EPM.ID = E.ID 
WHERE DisplayName IS NOT NULL 
GROUP BY E.DisplayName 
ORDER BY E.DisplayName, PS.SortNumber 
+0

谢谢。事情是,列将真正需要动态。 ProcessDesc字段将成为主要标题栏,可能会更改。你能适应你的代码吗?再次感谢! @Mihai – WebDevGuy 2014-11-20 23:45:29

+0

@WebDevGuy所以你想为每个ProcessDesc值设置一个列? – Mihai 2014-11-20 23:48:15

+0

@WebDevGuy你不能让它变成动态的,只有局部的,你要么得到所有的价值,要么你选择。如果他们改变我怎么知道如何去获得它们?你不能。 – Mihai 2014-11-20 23:55:35

1

试试这个:

SELECT DISTINCT E.DisplayName, EPM.DateCompleted, PS.SortNumber, PS.ProcessDesc 
FROM dbo.EPM 
    INNER JOIN dbo.PS 
    ON EPM.EPS = PS.ID 
    INNER JOIN dbo.E 
    ON EPM.ID = E.ID 
WHERE DisplayName IS NOT NULL 
ORDER BY E.DisplayName, PS.SortNumber 

SOLUTION:

#TEMP这里将您的查询生成一个使用动态SQL

declare @sql1 as varchar(4000) = '' 
declare @sql2 as varchar(4000) = '' 
declare @sql3 as varchar(4000) = '' 

set @sql1 = 
'select 
    DisplayName 
' 

select @sql2 = @sql2 + 
' ,max(case when ProcessDesc = ''' + ProcessDesc + ''' then DateCompleted end) as [' + ProcessDesc +'] 
' 
from #TEMP 
order by ProcessDesc, ProcessSort 

set @sql3 = 
' 
from #TEMP 
group by DisplayName 
ORDER BY DisplayName 
' 
print @sql1 + @sql2 [email protected] 
exec(@sql1 + @sql2 [email protected])