Optimiser l'utilisation des instructions CASE dans MySQL
P粉463840170
P粉463840170 2023-09-04 18:42:48
0
2
566
<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>
P粉463840170
P粉463840170

répondre à tous(2)
P粉670107661

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.

P粉785522400

Ceci est un exemple contenant à la fois class_end_date et enrollment_date -

SELECT 
    student_id,
    GROUP_CONCAT(IF(class = 'class 1', enrollment_date, null)) 'Class 1 Enrolled',
    GROUP_CONCAT(IF(class = 'class 1', class_end_date, null)) 'Class 1 End',
    GROUP_CONCAT(IF(class = 'class 2', enrollment_date, null)) 'Class 2 Enrolled',
    GROUP_CONCAT(IF(class = 'class 2', class_end_date, null)) 'Class 2 End',
    GROUP_CONCAT(IF(class = 'class 3', enrollment_date, null)) 'Class 3 Enrolled',
    GROUP_CONCAT(IF(class = 'class 3', class_end_date, null)) 'Class 3 End',
    GROUP_CONCAT(IF(class = 'class 4', enrollment_date, null)) 'Class 4 Enrolled',
    GROUP_CONCAT(IF(class = 'class 4', class_end_date, null)) 'Class 4 End'
FROM qa
GROUP BY student_id;
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal