如何在sql server 2005/8中使用没有聚合函数的列到行?

时间:2010-10-26 04:25:43

标签: sql sql-server tsql pivot

例如,我需要从

更改

alt text

alt text

我知道PIVOT就是为了这个,但它需要一个聚合函数;对于我的情况,我不需要聚合只需要列到行。

您可以使用以下示例数据:

    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 

3 个答案:

答案 0 :(得分:1)

如果每个主题有一条记录,您可以使用MIN或MAX。

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

答案 1 :(得分: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()聚合。

答案 2 :(得分:0)

11g的新PIVOT操作符可以帮助您实现所需的输出。例如,检查这个 http://querydb.blogspot.in/2014/05/get-data-in-rows-and-aggregates-into.html