例如,我需要从
更改
到
。
我知道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
答案 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)
如果用户每个主题有多个分数,我会使用AVG()
聚合。
答案 2 :(得分:0)
11g的新PIVOT操作符可以帮助您实现所需的输出。例如,检查这个 http://querydb.blogspot.in/2014/05/get-data-in-rows-and-aggregates-into.html