Видаліть з назвою стовпця


127

У мене є таблиця 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

За допомогою unpivot я можу отримати ім'я, позначає належним чином, але не в змозі отримати ім'я стовпця у вихідній таблиці до Subjectстовпця в потрібному наборі результатів.

Як я можу цього досягти?

Я поки що дійшов до наступного запиту (щоб отримати ім'я, позначки)

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

) as UnPvt

1
Чи можете ви опублікувати те, що ви робили до цього часу? запит / вихід.
Hart CO

Відповіді:


204

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

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

Див. SQL Fiddle з демонстрацією


@bluefeet Чи існує такий спосіб, що вам не потрібно вказувати імена (Maths, Science, English)? Я роблю цю операцію для багатьох таблиць, всі з однаковою структурою, але з різними назвами стовпців.
LBogaardt

1
@LBogaardt Ні, вам потрібно чітко визначити стовпці, які слід включити.
jjjjjjjjjjj

@LBogaardt Погляньте на мою відповідь тут , ви можете використовувати динамічний sql, щоб скасувати, не вказуючи назви стовпців.
Taryn

8

Ви також можете спробувати стандартний метод безвідвороту sql, використовуючи послідовність логіки із наступним кодом. У наступному коді є 3 кроки:

  1. створити кілька копій для кожного рядка, використовуючи перехресне з'єднання (також створюючи стовпчик теми в цьому випадку)
  2. створити стовпці "позначки" та заповнити відповідні значення, використовуючи вираз регістру (наприклад: якщо предмет - наука, то виберіть значення зі стовпця "наука")
  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;

Це також працює з будь-якими RDBMS! ЦІННОСТІ, коли вони недоступні, можна замінити підзапит на SELECT ... UNION ... SELECT ... Цікаво про ефективність цього CROSS JOIN, хоча ...
Cristi S.

0

ВИБІР * ВІД студента

UNPIVOT (Оцінки для предметів (математика, наука, англійська мова));


1
Це вже та сама відповідь, як прийнята та висококваліфікована відповідь, опублікована майже 6 років тому?
ImaginaryHuman072889

0

Ще одним способом використання перехресного з'єднання було б вказати назви стовпців всередині перехресного з'єднання

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.