2010-04-28 5 views
0

J'ai fait quelques recherches et trouvé des informations sur la manière de faire pivoter des nombres et de les additionner, mais je n'ai pas vu où je peux faire pivoter du texte.Comment faire pivoter de simples données de répétition dans SQL 2005 de type Texte

simplifié, nous avons une table qui ressemble un peu quelque chose comme ça ...

PlanID AreaAbbrev AreaDescription GoalText 
10133  Rec   Recreation   Johnny is good at... 
10133  Community  Community Part  Johnny is currently going... 
10133  Employment Employment   Johnny is currently employed at... 
10144  Rec   Recreation   Sammy is good at... 
10144  Community  Community Part  Sammy is currently going... 
10144  Employment Employment   Sammy is currently employed at... 

Vous pouvez voir il y a toujours trois différents AreaAbbrev et ils répètent. ET vous pouvez voir que le GoalText peut être long et est toujours différent.

Voici ce que j'aimerais que le nouveau Select ressemble.

PlanID Recreation   Community Part    Employment 
10133  Johnny is good at.. Johnny is currently going... Johnny is currently employeed at... 
10144  Sammy is good at.. Sammy is currently going... Sammy is currently employed at... 

Désolé pour tous les tirets ... J'ai essayé 4 ou 5 différentes façons d'afficher ces tables et ce fut tout ce que je pouvais travailler. Je devais utiliser les tirets comme des espaces pour l'aligner.

Des idées?

Répondre

0

Pivot La fonction nécessite toujours une fonction Agregate pour fonctionner. Donc, comme vous ne pouvez pas utiliser SUM ou AVG, vous pouvez utiliser le MIN ou MAX. Donc, voici un code pour obtenir ce que vous voulez.

SELECT PlanId, [Recreation], [Community party], [Employment] 
FROM 
(SELECT PlanId, AreaDescription, GoalText 
FROM dbo.TempArea) p 
PIVOT 
(
MAX (GoalText) 
FOR AreaDescription IN 
([Recreation], [Community party], [Employment]) 
) AS pvt 
ORDER BY PlanId 
0

Comme indiqué dans l'autre réponse, vous pouvez utiliser un PIVOT. Mais si vous n'avez pas un nombre connu d'enregistrements à transformer, vous pouvez utiliser un PIVOT dynamique.

Voir SQL Fiddle with Demo

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.areadescription) 
      FROM t c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT planid, ' + @cols + ' from 
      (
       select planid, areadescription, goaltext 
       from t 
      ) x 
      pivot 
      (
       min(goaltext) 
       for areadescription in (' + @cols + ') 
      ) p ' 


execute(@query) 
Questions connexes