2014-11-20 53 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])