rajah rajah Ответов: 2

Как применить pivot для этого в SQL-запросе


This is actual table

StudendID   Studentname   StudentMark

  17           raja          80
  17           raja          90 


I want my result to be like below


StudendID   Studentname   StudentMark_1   StudentMark_2

  17           raja          80                90          


Pls help 


Что я уже пробовал:

Я хочу знать, как получить свой результат с помощью sql-запроса, любая идея

2 Ответов

Рейтинг:
0

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 для Малика и санупа.


Karthik_Mahalingam

5

CHill60

Спасибо

Maciej Los

5ед!

CHill60

Спасибо!

Рейтинг:
0

Magic Wonder

Привет,

Проверить это...

http://web2.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query[^]

Надеюсь, это вам поможет.


Овации