Structure de tableau croisé dynamique dans SQLite
Introduction :
L'aplatissement des données, également connu sous le nom de format long, est une méthode courante de stockage de données dans SQLite. Cependant, il est parfois nécessaire de convertir ces données dans un format large, où chaque ligne représente une matière et les colonnes représentent les scores de cette matière pour un élève spécifique. Ce processus est appelé perspective.
Énoncé du problème :
Vous disposez de deux tableaux, l'un qui stocke les données des étudiants (étudiant, nom) et l'autre qui stocke leurs scores dans différentes matières (étudiant, sujet, notes). La tâche consiste à récupérer les informations sur les étudiants dans un format large où chaque ligne représente un étudiant et les colonnes représentent leurs notes dans une matière spécifique.
Solution utilisant CASE et GROUP BY :
<code class="language-sql">SELECT si.studid, si.name, SUM(CASE WHEN md.subjectid = 3 THEN md.marks END) AS subjectid_3, SUM(CASE WHEN md.subjectid = 4 THEN md.marks END) AS subjectid_4, SUM(CASE WHEN md.subjectid = 5 THEN md.marks END) AS subjectid_5 FROM student_info si JOIN markdetails md ON md.studid = si.studid GROUP BY si.studid, si.name;</code>
Cette solution utilise l'instruction CASE dans la fonction d'agrégation SUM(). Pour chaque identifiant de sujet (3, 4, 5), il vérifie si le tableau markdetails contient une ligne correspondante et additionne les scores correspondants. La clause GROUP BY garantit que les résultats sont regroupés par numéro d'identification et nom d'étudiant.
Solution alternative utilisant la jointure externe gauche :
<code class="language-sql">SELECT u.stuid, u.name, s3.marks AS subjectid_3, s4.marks AS subjectid_4, s5.marks AS subjectid_5 FROM student_info u LEFT OUTER JOIN markdetails s3 ON u.stuid = s3.stuid AND s3.subjectid = 3 LEFT OUTER JOIN markdetails s4 ON u.stuid = s4.stuid AND s4.subjectid = 4 LEFT OUTER JOIN markdetails s5 ON u.stuid = s5.stuid AND s5.subjectid = 5;</code>
Cette solution alternative utilise un LEFT OUTER JOIN pour faire correspondre les étudiants avec leurs scores respectifs dans le tableau markdetails. Pour les étudiants qui n'ont pas de scores dans une matière spécifique, les colonnes de scores (subjectid_3, subjectid_4, subjectid_5) seront renvoyées comme NULL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!