Existe-t-il une relation générale entre la jointure externe gauche et PIVOT?

Je viens juste d'avoir ma tête autour des jointures externes gauche, et je pratique des PIVOTS.

Je me request s'il est possible de convertir cette requête en un pivot?

SELECT mydrawercustomer.customerface, mydrawerordertype.ordertypeface, mydrawerorder.LM, Datediff(hour, a1.playdate, a2.playdate) AS [RunningTime1], Datediff(hour, a2.playdate, a3.playdate) AS [RunningTime2], Datediff(hour, a3.playdate, a4.playdate) AS [RunningTime3], Datediff(hour, a1.playdate, a4.playdate) AS [RunningTime4] FROM mydrawerorder LEFT OUTER JOIN mydrawercustomer ON mydrawerorder.customerKEY = mydrawercustomer.customerKEY LEFT OUTER JOIN mydrawerorderactivity a1 ON mydrawerorder.orderKEY = a1.orderKEY AND a1.activityKEY = 1 LEFT OUTER JOIN mydrawerorderactivity a2 ON mydrawerorder.orderKEY = a2.orderKEY AND a2.activityKEY = 2 LEFT OUTER JOIN mydrawerorderactivity a3 ON mydrawerorder.orderKEY = a3.orderKEY AND a3.activityKEY = 3 LEFT OUTER JOIN mydrawerorderactivity a4 ON mydrawerorder.orderKEY = a4.orderKEY AND a4.activityKEY = 4 INNER JOIN mydrawerordertype ON mydrawerorder.ordertypeKEY = mydrawerordertype.ordertypeKEY ORDER BY mydrawercustomer.customerface, mydrawerordertype.ordertypeface, mydrawerorder.LM, a1.playdate 

Je ne vous request pas de résoudre mon problème, mais je request simplement de l'aide pour commencer à convertir ce type de requête de jointure externe gauche en PIVOT.

Habituellement, la relation entre LEFT JOIN et PIVOT n'est pas simple, mais dans votre cas, la solution peut être trouvée.

Votre requête ressemblera à ceci:

 select customerface, ordertypeface, LM, Datediff(hour, [1], [2]) AS [RunningTime1], Datediff(hour, [2], [3]) AS [RunningTime2], Datediff(hour, [3], [4]) AS [RunningTime3], Datediff(hour, [1], [4]) AS [RunningTime4] from ( SELECT c.customerface, ot.ordertypeface, o.LM, a.activityKEY, a.playdate, o.orderKEY FROM mydrawerorder o INNER JOIN mydrawerordertype ot ON o.ordertypeKEY = ot.ordertypeKEY LEFT JOIN mydrawercustomer c ON o.customerKEY = c.customerKEY LEFT JOIN mydrawerorderactivity a ON o.orderKEY = a.orderKEY and a.activityKEY in (1, 2, 3, 4) ) x pivot ( max(playdate) for activityKEY in ([1], [2], [3], [4]) ) as pvt ORDER BY customerface, ordertypeface, LM, [1] 

Des informations supplémentaires selon l'utilisation de PIVOT peuvent être trouvées ici: http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx