2010-02-26 3 views
6

Il ya un question ici dans stackoverflow avec le même titre mais ce n'est pas ce que je cherche.
J'ai une table comme celle ci-dessousComment puis-je transformer des lignes en colonnes dans SQL Server 2005

Name | Count 
----------------  
Chery | 257 
Drew | 1500 
Morgon | 13 
Kath | 500 
Kirk | 200 
Matt | 76 

Je dois trasform ce jeu de résultats dans quelque chose comme ça

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 

Comment puis-je atteind ce serveur en utilisant SQL Server 2005?

Répondre

5

Il y a des questions similaires here, here ANSWERED stackoverflow.

Vous devez utiliser l'opérateur PIVOT dans votre requête à acheive this.Here est l'exemple et l'explication sur la façon dont vous pouvez faire that.The exemple est référencé à partir de la source this.

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.Name 
         FROM TESTTABLE AS t 
         ORDER BY '],[' + t.Name 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SET @query = N'SELECT '+ @cols +' FROM 
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p 
PIVOT (MAX([Count]) FOR Name IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

Explication

1. La première partie de la requête

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
         '],[' + t.Name 
       FROM TESTTABLE AS t 
       ORDER BY '],[' + t.Name 
       FOR XML PATH('') 
      ), 1, 2, '') + ']' 

vous donne un bon résultat aplaties de vos valeurs de la colonne Nom en une seule rangée comme suivre

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt] 

Vous pouvez lea En savoir plus sur le STUFF et XML PATH here et here.

2. SELECT + @cols + FROM sélectionnera toutes les lignes que les noms de Coloumn pour l'ensemble de résultats final (pvt - étape 3)

i.e.

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.Cette requête extrait toutes les lignes de données dont nous avons besoin pour créer les résultats du tableau croisé. Le (P) après la demande de recherche est la création d'une table temporaire des résultats qui peuvent ensuite être utilisés pour satisfaire à la requête pour l'étape 1.

(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p 

4.Le expression PIVOT

PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt 

fait le véritable et met les summarization résultats dans une table temporaire appelée pvt comme

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 
+0

+1, excellente solution et réponse. notez que le 'TOP 100 PERCENT' peut être changé en' TOP 30' ou autre, donc vous ne dépassez pas le nombre de colonnes si vous avez beaucoup de lignes. –

2

Voir Using PIVOT and UNPIVOT.

Vous pouvez utiliser les PIVOT et UNPIVOT opérateurs relationnels pour changer une expression d'une valeur de table dans une autre table . PIVOT tourne une expression valeur table en faisant tourner les uniques valeurs d'une colonne dans l'expression en plusieurs colonnes dans la sortie, et effectue des agrégations où ils sont nécessaires sur toute les valeurs des colonnes restantes qui sont souhaitée en finale sortie. UNPIVOT effectue l'opération inverse à PIVOT en faisant tourner des colonnes d'une expression de table dans la colonne .

La réponse rapide est

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt 
FROM 
(SELECT [Name], [Count] From Foo) 
PIVOT 
(
    MIN([Count]) 
    FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt) 
) AS PivotTable 
0

Si vous voulez éviter quoi que ce soit compliqué comme un pivot ou la réponse acceptée, vous pouvez le faire! (la plus grande partie du code consiste simplement à configurer les données de test au cas où quelqu'un voudrait l'essayer)

/* set up your test table */ 
declare @TestData table (Name Varchar(80),[Count] int)  
insert into @TestData (Name, [count]) 
Select 'Chery' as name, 257 as [count] 
union all select 'Drew', 1500 
union all select 'Morgon',13 
union all select 'Kath', 500 
union all select 'Kirk', 200 
union all select 'Matt', 76 

/* the query */ 
Declare @Query Varchar(max) 
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']' 
from @TestData 
Execute (@Query) 
/* result 

Chery  Drew  Morgon  Kath  Kirk  Matt 
----------- ----------- ----------- ----------- ----------- ----------- 
257   1500  13   500   200   76 

*/ 
Questions connexes