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;