Erstellen Sie mehr als eine Spalte in einer Pivot-Tabelle mit einer SQL-statement

Ich muss nach date in einer Pivot-Tabelle Projektdaten für die gleiche Projektnummer zu sortieren

Das Projekt sieht so aus:

"Project nr" "Task" "Task deadline" "Task Type Production" 123 pack 1 april 2013 Pack 123 Leave production 3 april 2013 Leave Production 123 Flight date 9 april 2013 Flight Date 

Die "Task Type Production" wird gemacht, um sicherzustellen, dass der Inhalt des Feldes immer konsistent ist. Ich kann nur eine Spalte in der Pivot-Tabelle erstellen. Gibt es eine Möglichkeit, diese Informationen in 3 Spalten anzuzeigen, wird es so aussehen:

 Project nr ; Pack ; leave production ; flightdate SELECT [TaskDeadline] AS Packed FROM MSP_EpmTask_UserView where [Task Type Production] = 'Packed' SELECT [TaskDeadline] AS LeaveProduction FROM MSP_EpmTask_UserView where [Task Type Production] = 'Leave Production' SELECT [TaskDeadline] AS FlightDate FROM MSP_EpmTask_UserView where [Task Type Production] = 'Flight Date' 

Danke Anne

Dies kann leicht mit einer Aggregatfunktion und einem CASE Ausdruck erfolgen:

 select [Project nr], MAX(case when [Task Type Production] = 'Pack' then [Task deadline] end) as Pack, MAX(case when [Task Type Production] = 'Leave Production' then [Task deadline] end) as [Leave Production], MAX(case when [Task Type Production] = 'Flight Date' then [Task deadline] end) as [Flight Date] from MSP_EpmTask_UserView group by [Project nr] 

Siehe SQL Fiddle mit Demo

Wenn du die PIVOT function in SQL server verwenden möchtest, dann ist die Abfrage:

 select * from ( select [Project nr],[Task deadline], [Task Type Production] from MSP_EpmTask_UserView ) src pivot ( max([Task deadline]) for [Task Type Production] in ([Pack], [Leave Production], [Flight Date]) ) piv 

Siehe SQL Fiddle mit Demo .

Schließlich kann dies mit mehreren Joins zu Ihrem Tisch durchgeführt werden:

 select t1.[Project nr], t1.[Task deadline] pack, t2.[Task deadline] [Leave Production], t3.[Task deadline] [Flight Date] from MSP_EpmTask_UserView t1 left join MSP_EpmTask_UserView t2 on t1.[Project nr] = t2.[Project nr] and t2.[Task Type Production] = 'Leave Production' left join MSP_EpmTask_UserView t3 on t1.[Project nr] = t3.[Project nr] and t3.[Task Type Production] = 'Flight Date' where t1.[Task Type Production] = 'Pack' 

Siehe SQL Fiddle mit Demo

Das Ergebnis aller Anfragen ist:

 | PROJECT NR | PACK | LEAVE PRODUCTION | FLIGHT DATE | ------------------------------------------------------------ | 123 | 2013-04-01 | 2013-04-03 | 2013-04-09 | 

Sie können versuchen, einen Cross-Tab oder Pivot mit der traditionellen Methode der korrelierten Unterabfragen zu erstellen:

 select [Project nr] , (select [Task deadline] from MSP_EpmTask_UserView where [Project nr] = t.[Project nr] and [Task Type Production] = 'Pack') as Pack , (select [Task deadline] from MSP_EpmTask_UserView where [Project nr] = t.[Project nr] and [Task Type Production] = 'Leave Production') as [Leave Production] , (select [Task deadline] from MSP_EpmTask_UserView where [Project nr] = t.[Project nr] and [Task Type Production] = 'Flight Date') as [Flight Date] from MSP_EpmTask_UserView t group by [Project nr] order by [Project nr] /* Project nr Pack Leave Production Flight Date ----------- ---------- ---------------- ----------- 123 2013-04-01 2013-04-03 2013-04-09 */ 

Ich habe dies in SQL server 2008, die die schöne date datatyp hat, obwohl Sie sicherlich dies mit Stichen oder datetime tun können. Dies setzt auch voraus, dass es nur einen von jedem date für ein bestimmtes Projekt nr gibt.

Auch wenn möglich, versuchen Sie nicht, Leerzeichen oder andere Sonderzeichen in Ihre DB-objectnamen zu setzen, die Sie zwingen, sie mit Klammern zu begrenzen.