risposta-alla-domanda-sullo-sviluppo-web-bd.com

Unpivot con il nome della colonna

Ho una tabella StudentMarks con le colonne Name, Maths, Science, English. I dati sono come

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

Voglio ottenere organizzato come il seguente:

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

Con unpivot Sono in grado di ottenere Nome, Contrassegna correttamente, ma non riesco a ottenere il nome della colonna nella tabella di origine nella colonna Subject nel risultato desiderato impostato.

Come posso raggiungere questo obiettivo?

Finora ho raggiunto la seguente query (per ottenere Nome, Contrassegni)

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

) as UnPvt
108
Tilak

La tua richiesta è molto vicina. Dovresti essere in grado di utilizzare quanto segue che include subject nell'elenco di selezione finale:

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

Vedi SQL Fiddle con demo

177
Taryn

Si può anche provare il metodo sql non pivoting standard usando una sequenza di logica con il seguente codice .. Il seguente codice ha 3 passaggi:

  1. creare più copie per ogni riga utilizzando cross join (anche creando una colonna soggetto in questo caso)
  2. creare la colonna "contrassegni" e inserire i valori pertinenti usando l'espressione caso (es: se l'argomento è scienza quindi scegli il valore dalla colonna scientifica)
  3. rimuovere eventuali combinazioni nulle (se esiste, l'espressione della tabella può essere completamente evitata se non ci sono rigorosamente valori nulli nella tabella di base)

     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;
    
7
Rahul Kohli