Unpivot mit Spaltennamen

127

Ich habe eine Tabelle StudentMarksmit SpaltenName, Maths, Science, English . Daten sind wie

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

Ich möchte es wie folgt arrangieren:

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

Mit Unpivot ich Name, Markierungen richtig , aber den Spaltennamen in der nicht auf die SubjectSpalte in der gewünschten Ergebnismenge übertragen.

Wie kann ich das erreichen?

Ich habe bisher die folgende Abfrage erreicht (um Name, Markierungen zu erhalten)

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

) as UnPvt
Tilak
quelle
1
Können Sie posten, was Sie bisher getan haben? Abfrage / Ausgabe.
Hart CO

Antworten:

204

Ihre Anfrage ist sehr nah. Sie sollten in der Lage sein, Folgendes zu verwenden, einschließlich der subjectin der endgültigen Auswahlliste enthaltenen:

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

Siehe SQL Fiddle mit Demo

Taryn
quelle
@bluefeet Gibt es eine Möglichkeit, dass Sie die Namen nicht angeben müssen (Mathematik, Naturwissenschaften, Englisch)? Ich mache diese Operation mit vielen Tabellen, alle mit der gleichen Struktur, aber mit unterschiedlichen Spaltennamen.
LBogaardt
1
@LBogaardt Nein, Sie müssen die einzuschließenden Spalten explizit definieren.
jjjjjjjjjjj
@LBogaardt Schauen Sie sich meine Antwort hier an . Sie können dynamisches SQL zum Aufheben des Pivots verwenden, ohne die Spaltennamen anzugeben.
Taryn
8

Sie können auch versuchen, die Standard-SQL-Un-Pivoting-Methode zu verwenden, indem Sie eine logische Folge mit dem folgenden Code verwenden. Der folgende Code besteht aus 3 Schritten:

  1. Erstellen Sie mit Cross Join mehrere Kopien für jede Zeile (in diesem Fall auch eine Betreffspalte).
  2. Erstellen Sie Spalten- "Markierungen" und geben Sie relevante Werte mit dem Fallausdruck ein (Beispiel: Wenn das Fach Wissenschaft ist, wählen Sie einen Wert aus der Wissenschaftsspalte aus).
  3. Entfernen Sie alle Nullkombinationen (falls vorhanden, kann der Tabellenausdruck vollständig vermieden werden, wenn die Basistabelle streng keine Nullwerte enthält.)

     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
quelle
Dies funktioniert auch mit jedem RDBMS! VALUES, wenn sie nicht verfügbar sind , können von einer Unterabfrage mit SELECT ... UNION ... SELECT ... Sie wundern sich über die Leistung , dass CROSS JOIN obwohl ... ersetzt werden
Cristi S.
0

SELECT * FROM student

UNPIVOT (Noten für Fächer in (Mathematik, Naturwissenschaften, Englisch));

Tutu Kumari
quelle
1
Dies ist bereits die gleiche Antwort wie die akzeptierte und hoch bewertete Antwort, die vor fast 6 Jahren veröffentlicht wurde?
ImaginaryHuman072889
0

Eine andere Möglichkeit, Cross Join zu verwenden, besteht darin, Spaltennamen innerhalb von Cross Join anzugeben

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Jeyhun
quelle