2010-10-26 44 views
1

例如,我需要从如何在sql server 2005/8中创建没有聚合函数的Column to Row?

alt text

改变

alt text

我知道PIVOT就是为了这个,但它需要一个聚合函数;对于我的情况,我不需要聚合只需要列到行。如果有将是一个创纪录的主题,你可以使用MIN或MAX

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

所以你实际上想要多列名为'80','90','70','85'?或者你是否在为每个用户名寻找一行,每一列都是主题?在这种情况下,@OMG小马的答案可以满足你的需求,而且你可以看到你确实需要一个聚合。 – 2010-10-26 04:35:40

回答

1

您可以使用下面的示例数据。

SELECT * 
FROM [StudentScores] 
PIVOT 
(
    MIN(Score) 
    FOR [Subject] IN ([Chinese],[Maths],[English],[Biology]) 
) 
AS p 
1

我无法完全从您的原始问题中知道您想要转换哪个字段 - 主题或分数。但是,您可以使用PIVOT来执行此操作。如果您知道想要从行更改为列的列数,则可以使用静态数据透视表(与其他答案相似)。如果你不知道改造的列数,那么你可以使用动态透视:

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) 

SQL Fiddle with Demo

我用AVG()聚集在用户每次主题不止一个得分事件。