3 votes

Une autre question de transposition des lignes aux colonnes - SQL Server 2005

Désolé, je sais que des questions similaires ont été posées de nombreuses fois auparavant, mais comme la plupart des gens, je n'ai pas été en mesure d'en trouver une qui correspond à mes besoins ou qui me donne suffisamment d'informations pour pouvoir avancer vers la solution.

Je soupçonne que je pourrais utiliser les commandes PIVOT ou UNPIVOT de T-SQL, mais je ne parviens pas à suivre l'explication de MSDN et il ne semble pas y avoir de guides du type "pour les nuls" disponibles!

Passons à mon problème - je dois convertir un large tableau composé de nombreuses colonnes en un ensemble de résultats basé sur les lignes pour un rapport. Aucune agrégation n'est nécessaire et j'essaie d'éviter une sélection basée sur UNION répétée si possible.

L'ensemble de résultats du tableau est formaté comme suit (il y a en fait beaucoup plus de colonnes pour les personnes! :s ):

Person1 | Person2 | Person3 | Person4 | Person5 | Person6 | Person7 | Person8
-----------------------------------------------------------------------------
Bob       Sam       Tom       Alex      Paul      Ann       Jill      Jane

Ce dont j'ai vraiment besoin, c'est de pouvoir produire ce qui suit:

Person
--------------------
Bob       
Sam       
Tom       
Alex      
Paul      
Ann       
Jill      
Jane

Un bonus serait de pouvoir créer un ensemble de résultats tel que:

Colonne    Personne
--------------------
Personne1   Bob       
Personne2   Sam       
Personne3   Tom       
Personne4   Alex      
Personne5   Paul      
Personne6   Ann       
Personne7   Jill      
Personne8   Jane

Comment cela peut-il être réalisé en utilisant T-SQL dans SQL Server 2005?

Merci pour toute aide,

Paul.

--Modifier--

Grâce à Martin, j'ai appris quelque chose de nouveau ce matin et j'ai réussi à obtenir exactement ce dont j'avais besoin. En fin de compte, j'ai dû modifier légèrement l'exemple pour obtenir ce dont j'avais besoin, mais c'est parce que mon exemple original avait omis quelques détails que je n'avais pas réalisés qui seraient importants!

Mon code final ressemblait à ceci pour toute personne ayant un tel problème:

AVEC Query_CTE([TitrePersonne1],[TitrePersonne2],[TitrePersonne3]) 
COMME
--Expression CTE et liste de colonnes
(
    SELECT  
            --Converti pour créer un type de données commun. 
            CONVERT(NVARCHAR(MAX),TitrePersonne1) AS 'TitrePersonne1',
            CONVERT(NVARCHAR(MAX),TitrePersonne2) AS 'TitrePersonne2',
            CONVERT(NVARCHAR(MAX),TitrePersonne3) AS 'TitrePersonne3'
FROM NomTable
WHERE IdClé = 'XXX' 
)
SELECT *
FROM Query_CTE
UNPIVOT
   (Personne POUR [Colonne] DANS 
    (   
        [TitrePersonne1],
        [TitrePersonne2],        
        [TitrePersonne3]
    )
)COMME unpvt;

3voto

Martin Smith Points 174101
AVEC T(Personne1,Personne2 /* etc....*/) EN TANT QUE
(
SÉLECTIONNER 'Bob','Sam' /* etc....*/
)
SÉLECTIONNER *
DE T
DÉPIVOTER
   (Personne POUR [Colonne] DANS 
      (Personne1,Personne2 /* etc....*/)
)COMME unpvt;

0voto

Dalex Points 2420

Pour transposer facilement des colonnes en lignes avec leurs noms, vous devriez utiliser XML. Dans mon blog, j'ai décrit cela avec un exemple: http://sql-tricks.blogspot.com/2011/04/sql-server-rows-transpose.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X