148 votes

Dépivoter avec le nom de colonne

J'ai une table StudentMarks avec les colonnes Name, Maths, Science, English. Les données sont comme suit

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

Je veux l'organiser comme suit:

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

Avec unpivot je suis capable d'obtenir le Nom et les Marques correctement, mais je ne parviens pas à obtenir le nom de la colonne dans la table source dans la colonne Sujet dans l'ensemble de résultats souhaité.

Comment puis-je accomplir cela?

Jusqu'à présent, j'ai atteint la requête suivante (pour obtenir le Nom, les Marques)

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

) as UnPvt

232voto

bluefeet Points 105508

Votre requête est très proche. Vous devriez pouvoir utiliser ce qui suit, qui inclut le sujet dans la liste finale de sélection :

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

Voir SQL Fiddle avec démonstration

11voto

Rahul Kohli Points 111

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

  1. créez plusieurs copies pour chaque ligne en utilisant une jointure transversale (créant également une colonne de sujet dans ce cas)
  2. créez la colonne "marks" et remplissez les valeurs pertinentes en utilisant une expression CASE (par ex: si le sujet est la science, alors choisissez la valeur de la colonne science)
  3. supprimez toutes les combinaisons nulles (si elles existent, l'expression de table peut être totalement évitée s'il n'y a strictement 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;

5voto

Jeyhun Points 31

Une autre méthode pour utiliser une jointure croisée serait de spécifier les noms de colonnes à l'intérieur de la jointure croisée

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X