Как сделать Column to Row без агрегатной функции в SQL Server 2005/8? - PullRequest
1 голос
/ 26 октября 2010

Например, мне нужно изменить значение с

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 ]

1 голос
/ 20 августа 2012

По исходному вопросу я не могу точно определить, какую область вы хотите преобразовать - тему или оценку. Однако вы можете использовать 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 с демоверсией

Я использовал совокупность AVG() в том случае, если у пользователя более одного балла по одному предмету.

1 голос
/ 26 октября 2010

Если на предмет будет одна запись, вы можете использовать MIN или MAX.

SELECT *
FROM [StudentScores]
PIVOT
(
  MIN(Score)
  FOR [Subject] IN ([Chinese],[Maths],[English],[Biology])
)
AS p
0 голосов
/ 15 мая 2014

Новый оператор PIVOT в 11g может помочь вам достичь желаемого результата.Проверьте это например http://querydb.blogspot.in/2014/05/get-data-in-rows-and-aggregates-into.html

...