Как создать столбцы для строки без агрегатной функции в SQL Server 2005/8?
Например, мне нужно изменить
в
- SQL Pivot нет совокупности
- Строки PIVOT для столбцов с более чем 1 значением возвращены
- SQL Server - запрос с использованием нескольких инструкций WHERE в том же столбце
- Изменение ориентации таблицы в sql
- Как показать результат результата columnar (в разных столбцах) вместо строки за строкой?
,
Я знаю, что 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
- Что мне нужно изменить в моем сводном запросе T-SQL для достижения этого конкретного результата?
- SQL Pivot с двумя столбцами
- Строки SQL Server Строки со строковым значением
- Столбец с динамической сводной таблицей
- Получить ROWS как COLUMNS (SQL Server динамический запрос PIVOT)
- t-sql pivot - ежемесячный доход
- Как повернуть стол по горизонтали в sql-сервере
- Сводный запрос для возврата нескольких повторяющихся групп?
Если на одном объекте будет одна запись, вы можете использовать MIN или MAX.
SELECT * FROM [StudentScores] PIVOT ( MIN(Score) FOR [Subject] IN ([Chinese],[Maths],[English],[Biology]) ) AS p
Я не могу сказать из вашего первоначального вопроса, какое поле вы хотите преобразовать – субъект или оценка. Однако вы можете использовать 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()
если пользователь имеет более одного балла на одного субъекта.
Новый оператор PIVOT в 11g может помочь вам достичь желаемого результата. Проверьте это, например, http://querydb.blogspot.in/2014/05/get-data-in-rows-and-aggregates-into.html.