148 Stimmen

Unpivot mit Spaltenname

Ich habe eine Tabelle StudentMarks mit den Spalten Name, Mathematik, Naturwissenschaften, Englisch. Daten sehen so aus

Name,  Mathematik, Naturwissenschaften, Englisch  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

Ich möchte es folgendermaßen sortiert haben:

Name,  Fach,  Noten
Tilak, Mathematik,    90
Tilak, Naturwissenschaften,  40
Tilak, Englisch,  60

Mit unpivot kann ich Name, Noten richtig bekommen, aber ich kann den Spaltennamen in der Ausgangstabelle nicht in die Fach Spalte im gewünschten Ergebnisset bekommen.

Wie kann ich das erreichen?

Bisher habe ich die folgende Abfrage erreicht (um Name, Noten zu bekommen)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Mathematik, Naturwissenschaften, Englisch)

) as UnPvt

232voto

Taryn Punkte 233818

Ihre Abfrage ist sehr nah dran. Sie sollten in der Lage sein, das folgende zu verwenden, das das subject in der endgültigen Auswahlliste enthält:

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

Siehe SQL Fiddle mit Demo

11voto

Rahul Kohli Punkte 111

Sie können auch die Standard-SQL-Un-Pivotierungsmethode ausprobieren, indem Sie eine Sequenz von Logik mit folgendem Code verwenden. Der folgende Code besteht aus 3 Schritten:

  1. Erstellen Sie mehrere Kopien für jede Zeile mittels einer Kreuzverbindung (und erstellen Sie in diesem Fall auch eine Spaltenüberschrift)
  2. Erstellen Sie die Spalte "Marks" und füllen Sie relevante Werte mithilfe eines Fallausdrucks ein (z. B. wenn das Fach Naturwissenschaften ist, dann wählen Sie den Wert aus der Spalte Science)
  3. Entfernen Sie alle Null-Kombinationen (falls vorhanden; der Tabellenausdruck kann vollständig vermieden werden, wenn streng keine Nullwerte in der Basistabelle vorhanden sind)

    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;

5voto

Jeyhun Punkte 83

Ein weiterer Weg, um Cross Join zu vermeiden, wäre, die Spaltennamen innerhalb des Cross Join zu spezifizieren

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X