CHill60
Ссылка, приведенная в решении 1, является хорошим ресурсом, но я подозреваю, что вам понадобится немного больше помощи.
Похоже, у вас нет никакого столбца ID для этой таблицы - таблица не полностью нормализована, так как вы дублируете данные (Studentname) в каждой строке, поэтому StudendID не считается идентификатором таблицы.
Это не проблема, пока вы не захотите понять, в каком порядке были получены отметки. Столбец идентификаторов в вашей таблице позволит вам упорядочить строки в том порядке, в котором они были добавлены в таблицу. Столбец datetime, который автоматически обновляется, будет делать то же самое, но столбец identity намного проще - например,
create table students
(
id int identity(1,1),
StudendID int,
Studentname varchar(30),
StudentMark int
)
Вам нужно будет знать ранг или номер каждой отметки по отношению к каждому студенту (предполагая, что в этой таблице будет более одного студента), чтобы получить правильные столбцы в ваших результатах.
Чтобы продемонстрировать, что я имею в виду, я вставил эти данные в таблицу
insert into students values
(17, 'raja', 105), (17, 'raja', 80), (17, 'raja', 90),
(18, 'malik', 85), (18, 'malik', 95),
(19, 'sanoop',75), (19, 'sanoop',85)
затем запустил этот запрос
select StudendID, Studentname, StudentMark,
ROW_NUMBER() OVER (PARTITION BY StudendID ORDER BY id) AS rn
from students
что дает мне эти результаты
StudendID Studentname StudentMark rn
17 raja 105 1
17 raja 80 2
17 raja 90 3
18 malik 85 1
18 malik 95 2
19 sanoop 75 1
19 sanoop 85 2
Таким образом, мы можем совершенно ясно видеть, что первая отметка Раджи была 105, его 2-Я-80, а его 3-я-90.
Если мы вставим этот запрос в простой пример pivot по ссылке в решении 1, то получим следующее
select StudendID, Studentname, ISNULL([1],0) StudentMark_1, ISNULL([2],0) StudentMark_2, ISNULL([3],0) StudentMark_3
from
(
select StudendID, Studentname, StudentMark,
ROW_NUMBER() OVER (PARTITION BY StudendID ORDER BY id) AS rn
from students
) as query
PIVOT
(
MAX(StudentMark) FOR rn IN ([1],[2],[3])
) as pvt
order by StudendID
с этим результатом
StudendID Studentname StudentMark_1 StudentMark_2 StudentMark_3
17 raja 105 80 90
18 malik 85 95 0
19 sanoop 75 85 0
Единственные другие вещи, которые стоит отметить, это
- Я
MAX(Studentmark)
чтобы получить отметки в сводных результатах, потому что сводная функция
должен быть использованным в PIVOT. Я мог бы просто легко использовать
SUM
или
AVG
и т. д. Потому что существует только 1 значение на каждого студента для каждого значения
rn
, но если функция не используется, то возникает ошибка.
- Мне пришлось окружить значения 1,2,3 квадратными скобками (
[1],[2],[3]
) в сводной таблице, потому что они представляют там имена столбцов, а не значения, и имена столбцов не могут начинаться с цифры.
- Я
ISNULL()
чтобы привести в порядок нулевые значения в моих результатах для StudentMark_3 для Малика и санупа.