2010-10-26 22 views
1

Par exemple, je dois changer deComment faire de Column to Row sans une fonction d'agrégation dans sql server 2005/8?

alt text

à

alt text.

Je sais que PIVOT est pour cela, mais il nécessite une fonction d'agrégat; et pour mon cas, je n'ai pas besoin d'agréger seulement besoin de colonne pour ramer.

Vous pouvez utiliser les données d'exemple suivant:

CREATE TABLE[StudentScores] 
( 
[UserName] NVARCHAR(20), 
[Subject] NVARCHAR(30), 
[Score]FLOAT, 
) 
GO 

INSERT INTO[StudentScores]SELECT'Nick','Chinese',80 

INSERT INTO[StudentScores]SELECT'Nick','Maths',90 

INSERT INTO[StudentScores]SELECT'Nick','English',70 

INSERT INTO[StudentScores]SELECT'Nick','Biology',85 

INSERT INTO[StudentScores]SELECT'Kent','Chinese',80 

INSERT INTO[StudentScores]SELECT'Kent','Maths',90 

INSERT INTO[StudentScores]SELECT'Kent','English',70 

INSERT INTO[StudentScores]SELECT'Kent','Biology',85 
+0

Donc, vous voulez réellement plusieurs colonnes nommées '80', '90', '70', '85'? Ou cherchez-vous une rangée pour chaque nom d'utilisateur et chaque colonne est les sujets? Dans ce cas, @OMG Ponies répond à vos besoins, et comme vous pouvez le voir, vous avez vraiment besoin d'un agrégat. –

Répondre

1

S'il va être un enregistrement par sujet que vous pouvez utiliser MIN ou MAX.

1

Je ne peux pas dire à partir de votre question initiale quel champ vous voulez transformer - sujet ou score. Toutefois, vous pouvez utiliser un PIVOT pour effectuer cela. Si vous connaissez le nombre de colonnes que vous souhaitez modifier de lignes en colonnes, vous pouvez utiliser un pivot statique (similaire à l'autre réponse). Si vous ne connaissez pas le nombre de colonnes à transformer, vous pouvez utiliser un pivot dynamique:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(subject) 
        from test 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
     = 'SELECT username,' + @cols + ' from 
     (
      select username, subject, score 
      from test 
     ) x 
     pivot 
     (
      avg(score) 
      for subject in(' + @cols + ') 
     ) p ' 

execute(@query) 

Voir SQL Fiddle with Demo

je l'ensemble AVG() dans le cas où un utilisateur a plus d'un titre par sujet .