Optimiser l'utilisation des instructions CASE dans MySQL
P粉463840170
2023-09-04 18:42:48
<p>Bonjour à tous,</p>
<p>J'ai un tableau comme indiqué dans la capture d'écran ci-dessus. J'ai écrit une requête en utilisant l'instruction <code>CASE</code> afin qu'elle renvoie les colonnes supplémentaires dont j'avais besoin. Voici la requête que j'ai écrite : </p>
<pre class="brush:php;toolbar:false;">SELECT
*,
CAS QUAND (SUM(CASE WHEN class = 'class 1' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 1',
CAS QUAND (SUM(CASE WHEN class = 'class 2' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 2',
CAS QUAND (SUM(CASE WHEN class = 'class 3' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 3',
CASE WHEN (SUM(CASE WHEN class = 'class 4' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 4'
DE qa;≪/pre>
<p>Voici le tableau des résultats que j'obtiens : </p>
<p>Ce que je souhaite obtenir dans cette requête, c'est que si un étudiant a suivi le cours, il affichera <code>1</code> sous la colonne de classe pour toutes les lignes appartenant à cet étudiant. </p>
<p>Par exemple, un élève avec <code>student_id</code> <code>2</code> est en classe <code>1</code> Sous la colonne ;/code>, les deux lignes pour <code>student_id</code> <code>2</code> </p>
<p>J'ai obtenu ce que je voulais dans la requête, mais maintenant, au lieu d'utiliser <code>1</code>, je veux que ce soit le <code>enrollment_date</code> Voici le résultat final que je souhaite : </p>
<p>Puis-je savoir comment modifier la requête pour obtenir le résultat final dans la capture d'écran ci-dessus ? </p>
<p><strong>Deuxième question :</strong></p>
<p>Comme vous pouvez le voir dans la requête ci-dessus, chaque classe possède une instruction <code>CASE</code> distincte pour créer des colonnes pour cette classe. Cependant, à l'avenir, il pourrait y avoir 5,6,7,... classes, donc chaque fois qu'il y aura de nouvelles classes différentes, je devrai à nouveau ajouter des instructions <code>CASE</code>Est-il possible d'optimiser ma requête afin de ne pas avoir besoin d'avoir 4 instructions <code>CASE</code> pour 4 classes différentes, tout en étant capable de créer des colonnes pour différentes classes (quand il y a une nouvelle classe , il y aura de nouvelles colonnes) classes également) ? </p>
<h2>Exemple de données</h2>
<pre class="brush:php;toolbar:false;">créer une table qa(
étudiant_id INT,
classe varchar(20),
date de fin_de_classe,
date_d'inscription date
);
insérer dans qa (student_id, class, class_end_date, enrollment_date)
valeurs
(1, 'classe 1', '2022-03-03', '2022-02-14'),
(1, 'classe 3', '2022-06-13', '2022-04-12'),
(1, 'classe 4', '2022-07-03', '2022-06-19'),
(2, 'classe 1', '2023-03-03', '2022-07-14'),
(2, 'classe 2', '2022-08-03', '2022-07-17'),
(4, 'classe 4', '2023-03-03', '2022-012-14'),
(4, 'classe 2', '2022-04-03', '2022-03-21')
;</pre></p>
Voir Pivot pour une procédure stockée qui générera et [éventuellement] exécutera des requêtes basées sur les définitions de table et les données.
Ceci est un exemple contenant à la fois class_end_date et enrollment_date -