Unpivot z nazwą kolumny

127

Mam stół StudentMarksz kolumnami Name, Maths, Science, English. Dane są jak

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

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

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

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

Jak mogę to osiągnąć?

Dotarłem do tej pory do następującego zapytania (aby uzyskać Imię, Znaki)

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

) as UnPvt
Tilak
źródło
1
Czy możesz opublikować, co zrobiłeś do tej pory? zapytanie / wyjście.
Hart CO

Odpowiedzi:

204

Twoje zapytanie jest bardzo bliskie. Powinieneś być w stanie użyć następujących elementów, które znajdują się subjectna 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 Fiddle z demo

Taryn
źródło
@bluefeet Czy istnieje sposób, w którym nie trzeba podawać nazw (matematyka, nauka, język angielski)? Wykonuję tę operację dla wielu tabel, wszystkie o tej samej strukturze, ale z różnymi nazwami kolumn.
LBogaardt,
1
@LBogaardt Nie, musisz jawnie zdefiniować kolumny do uwzględnienia.
jjjjjjjjjjj
@LBogaardt Spójrz na moją odpowiedź tutaj , możesz użyć dynamicznego sql do unpivot bez określania nazw kolumn.
Taryn
8

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. utwórz wiele kopii dla każdego wiersza za pomocą sprzężenia krzyżowego (w tym przypadku również tworząc kolumnę tematu)
  2. utwórz kolumny „znaczniki” i wypełnij odpowiednie wartości, używając wyrażenia przypadku (np. jeśli przedmiotem jest nauka, wybierz wartość z kolumny nauka)
  3. usuń wszelkie kombinacje null (jeśli istnieją, można całkowicie uniknąć wyrażenia tabeli, jeśli w tabeli podstawowej nie ma absolutnie żadnych 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;
Rahul Kohli
źródło
Działa to również z każdym systemem RDBMS! WARTOŚCI, gdy nie jest dostępna, może być zastąpiony przez podzapytanie z wybranymi ... unia ... select ... Zastanawiasz o wykonywaniu tego CROSS JOIN chociaż ...
Cristi S.
0

SELECT * FROM student

UNPIVOT (oceny za przedmioty z (matematyka, nauki ścisłe, angielski));

Tutu Kumari
źródło
1
To już ta sama odpowiedź, co zaakceptowana i wysoko oceniana odpowiedź opublikowana prawie 6 lat temu?
ImaginaryHuman072889
0

Innym sposobem użycia sprzężenia krzyżowego byłoby określenie nazw kolumn w sprzężeniu krzyżowym

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Jeyhun
źródło