Unpivot с именем столбца
У меня есть таблица StudentMarks
со столбцами Name, Maths, Science, English
.
Данные похожи на
Name, Maths, Science, English
Tilak, 90, 40, 60
Raj, 30, 20, 10
Я хочу настроить его следующим образом:
Name, Subject, Marks
Tilak, Maths, 90
Tilak, Science, 40
Tilak, English, 60
С univot Я могу правильно определить Name, Marks, но не смог получить имя столбца в исходной таблице в Subject
в желаемом наборе результатов.
Как я могу это достичь?
Я до сих пор дошел до следующего запроса (чтобы получить Name, Marks)
select Name, Marks from studentmarks
Unpivot
(
Marks for details in (Maths, Science, English)
) as UnPvt
Ответы
Ответ 1
Ваш запрос очень близок. Вы должны быть в состоянии использовать следующее, которое включает subject
в окончательный список выбора:
select u.name, u.subject, u.marks
from student s
unpivot
(
marks
for subject in (Maths, Science, English)
) u;
Смотрите SQL Fiddle с демо
Ответ 2
Вы также можете попробовать стандартный метод разворачивания sql, используя последовательность логики со следующим кодом. Следующий код состоит из 3 шагов:
- создайте несколько копий для каждой строки, используя перекрестное соединение (в этом случае также создайте столбец темы)
- создайте столбец "отметки" и заполните соответствующие значения, используя выражение случая (например: если предмет - наука, тогда выберите значение из столбца науки)
-
удалить любые нулевые комбинации (если существует, табличного выражения можно полностью избежать, если в базовой таблице нет нулевых значений)
select *
from
(
select name, subject,
case subject
when 'Maths' then maths
when 'Science' then science
when 'English' then english
end as Marks
from studentmarks
Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
)as D
where marks is not null;
Ответ 3
Спасибо. Отличный ответ.
выберите u.name, u.subject, u.marks из развёртки студента (оценки по предмету в (математика, естествознание, английский)) u;
Ответ 4
ВЫБРАТЬ * ОТ студента
UNPIVOT (оценки по предметам (математика, естествознание, английский));