Отмена с именем столбца


у меня есть таблица 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

С преобразование я могу получить имя, метки правильно, но не в состоянии получить имя столбца в исходной таблице Subject столбец в требуемом результирующем наборе.

как я могу добиться этого?

Я до сих пор достиг следующего запроса (чтобы получить имя, метки)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt
2 95

2 ответа:

ваш запрос очень близок. Вы должны быть в состоянии использовать следующее, которое включает в себя subject в последнем списке выбора:

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

посмотреть SQL Скрипка с демо

вы также можете попробовать стандартный метод SQL un-pivoting, используя последовательность логики со следующим кодом.. Следующий код имеет 3 шага:

  1. создайте несколько копий для каждой строки с помощью cross join (в этом случае также создается столбец subject)
  2. создайте столбец "метки" и заполните соответствующие значения с помощью выражения case ( например: если предметом является наука, выберите значение из столбца науки)
  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;