Unpivot z nazwą kolumny

Mam tabelę StudentMarks z kolumnami Name, Maths, Science, English. Dane są jak

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

Chcę to zorganizować w następujący sposób:

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60

Z unpivot jestem w stanie uzyskać nazwę, znaki poprawnie, ale nie jestem w stanie uzyskać nazwy kolumny w tabeli źródłowej do kolumny Subject W pożądanym zestawie wyników.

Jak mogę to osiągnąć?

Do tej pory dotarłem do następującego zapytania (aby uzyskać nazwę, znaki)

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

) as UnPvt
Author: Blorgbeard, 2013-09-27

2 answers

Twoje zapytanie jest bardzo bliskie. Powinieneś być w stanie użyć następujących, które zawierają subject na ostatecznej liście wyboru:

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

Zobacz SQL z demo

 155
Author: Taryn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 16:20:58

Możesz również wypróbować standardową metodę SQL un-pivoting, używając sekwencji logiki z następującym kodem.. Poniższy kod składa się z 3 kroków:

  1. tworzenie wielu kopii dla każdego wiersza za pomocą łączenia krzyżowego (również tworzenie kolumny tematu w tym przypadku)
  2. Utwórz kolumnę "znaczniki" i wypełnij odpowiednie wartości za pomocą wyrażenia case (np. jeśli przedmiotem jest nauka, wybierz wartość z kolumny nauka)
  3. Usuń dowolne kombinacje null ( jeśli istnieje, wyrażenie table może być w pełni unikanie, jeśli w tabeli bazowej nie ma bezwzględnie wartości null)

     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;
    
 4
Author: Rahul Kohli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 21:51:15