Pivot SQL avec plusieurs colonnes

Besoin d'aide avec la clause pivot dans sql server 2008. J'ai une table avec cette info:

 Weekno DayOfWeek FromTime ToTime
 1 2 10:00 14:00
 1 3 10:00 14:00
 2 3 08:00 13:00
 2 4 09:00 13:00
 2 5 14:00 22:00
 3 1 06:00 13:00
 3 4 06:00 13:00
 3 5 14:00 22:00

Je veux convertir ceci en une table qui ressemble à ceci:

 Semaine Début1 Fin1 Départ2 Fin2 Départ3 Fin3 Départ4 Fin4 Départ5 Fin5 Départ5 Fin6 Départ7 Fin7
 1 10h00 14h00 10h00 14h00
 2 08:00 13:00 09:00 13:00 14:00 22:00
 3 06:00 13:00 06:00 13:00 14:00 22:00

Y a-t-il un moyen de faire avec une requête pivot? S'il vous plaît écrivez répondre avec un exemple sur la façon de le faire.

J'apprécie toute sorte d'aide à ce sujet. Merci d'avance.

Voici la version pivot:

https://data.stackexchange.com/stackoverflow/query/7295/so3241450

-- SO3241450 CREATE TABLE #SO3241450 ( Weekno int NOT NULL ,DayOfWeek int NOT NULL ,FromTime time NOT NULL ,ToTime time NOT NULL ) INSERT INTO #SO3241450 VALUES (1, 2, '10:00', '14:00') ,(1, 3, '10:00', '14:00') ,(2, 3, '08:00', '13:00') ,(2, 4, '09:00', '13:00') ,(2, 5, '14:00', '22:00') ,(3, 1, '06:00', '13:00') ,(3, 4, '06:00', '13:00') ,(3, 5, '14:00', '22:00') ;WITH Base AS ( SELECT Weekno, DayOfWeek, FromTime AS [Start], ToTime AS [End] FROM #SO3241450 ) ,norm AS ( SELECT Weekno, ColName + CONVERT(varchar, DayOfWeek) AS ColName, ColValue FROM Base UNPIVOT (ColValue FOR ColName IN ([Start], [End])) AS pvt ) SELECT * FROM norm PIVOT (MIN(ColValue) FOR ColName IN ([Start1], [End1], [Start2], [End2], [Start3], [End3], [Start4], [End4], [Start5], [End5], [Start6], [End6], [Start7], [End7])) AS pvt​ 

Personnellement, je déteste les pivots – difficile à lire et sans faille.

 CREATE TABLE #test ( WeekNo int, [DayOfWeek] int, FromTime time, ToTime time ) INSERT INTO #test SELECT 1,2,'10:00','14:00' UNION ALL SELECT 1,3,'10:00','14:00' UNION ALL SELECT 2,3,'08:00','13:00' UNION ALL SELECT 2,4,'09:00','13:00' UNION ALL SELECT 2,5,'14:00','22:00' UNION ALL SELECT 3,1,'06:00','13:00' UNION ALL SELECT 3,4,'06:00','13:00' UNION ALL SELECT 3,5,'14:00','22:00' SELECT WeekNo, MAX(CASE WHEN DayOfWeek = 1 THEN FromTime ELSE NULL END) AS Start1, MAX(CASE WHEN DayOfWeek = 1 THEN ToTime ELSE NULL END) AS End1, MAX(CASE WHEN DayOfWeek = 2 THEN FromTime ELSE NULL END) AS Start2, MAX(CASE WHEN DayOfWeek = 2 THEN ToTime ELSE NULL END) AS End2, MAX(CASE WHEN DayOfWeek = 3 THEN FromTime ELSE NULL END) AS Start3, MAX(CASE WHEN DayOfWeek = 3 THEN ToTime ELSE NULL END) AS End3, MAX(CASE WHEN DayOfWeek = 4 THEN FromTime ELSE NULL END) AS Start4, MAX(CASE WHEN DayOfWeek = 4 THEN ToTime ELSE NULL END) AS End4, MAX(CASE WHEN DayOfWeek = 5 THEN FromTime ELSE NULL END) AS Start5, MAX(CASE WHEN DayOfWeek = 5 THEN ToTime ELSE NULL END) AS End5, MAX(CASE WHEN DayOfWeek = 6 THEN FromTime ELSE NULL END) AS Start6, MAX(CASE WHEN DayOfWeek = 6 THEN ToTime ELSE NULL END) AS End6, MAX(CASE WHEN DayOfWeek = 7 THEN FromTime ELSE NULL END) AS Start7, MAX(CASE WHEN DayOfWeek = 7 THEN ToTime ELSE NULL END) AS End7 FROM #test GROUP BY WeekNo 

Et ça va souffler les chaussettes d'un pivot; performance sage.

Je pense que le CAS QUAND ne fonctionnera que s'il n'y a que Weekno et DayofWeek uniques car il ne returnnera que les loggings des derniers time de début et de fin et filterra le rest. Exemple

 Weekno DayOfWeek FromTime ToTime 1 2 10:00 14:00 1 2 07:00 09:00 2 3 08:00 13:00 2 4 09:00 13:00 

Il ne returnnera que la première ligne de semaine no 1 de DayofWeek 2 et passera la deuxième ligne.