web-dev-qa-db-fra.com

Unpivot avec nom de colonne

J'ai un tableau StudentMarks avec des colonnes Name, Maths, Science, English. Les données sont comme

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

Je veux que ce soit arrangé comme suit:

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

Avec npivot , je peux obtenir le nom, les marques correctement, mais je ne peux pas obtenir le nom de la colonne dans la table source dans la colonne Subject du jeu de résultats souhaité.

Comment puis-je atteindre cet objectif?

J'ai jusqu'à présent atteint la requête suivante (pour obtenir un nom, des marques)

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

) as UnPvt
115
Tilak

Votre requête est très proche. Vous devriez pouvoir utiliser les éléments suivants, qui incluent le subject dans la liste de sélection finale:

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

Voir SQL Fiddle avec démo

186
Taryn

Vous pouvez également essayer la méthode standard de dé-pivotement de SQL en utilisant une séquence de logique avec le code suivant. Le code suivant comporte 3 étapes:

  1. créer plusieurs copies pour chaque ligne en utilisant une jointure croisée (en créant également une colonne de sujet dans ce cas)
  2. créer une colonne "marques" et saisir les valeurs pertinentes en utilisant une expression de casse (par exemple, si le sujet est scientifique, choisissez une valeur dans la colonne science)
  3. supprime toutes les combinaisons nulles (si elles existent, l'expression de table peut être entièrement évitée s'il n'y a aucune valeur nulle dans la table de 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

SELECT * FROM student

UNPIVOT (marques POUR matières en (mathématiques, sciences, anglais));

0
Tutu Kumari