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
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
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:
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;
SELECT * FROM student
UNPIVOT (marques POUR matières en (mathématiques, sciences, anglais));