Optimieren Sie die Verwendung von CASE-Anweisungen in MySQL
P粉463840170
2023-09-04 18:42:48
<p>Hallo zusammen,</p>
<p>Ich habe eine Tabelle wie im Screenshot oben gezeigt. Ich habe eine Abfrage mit der Anweisung <code>CASE</code> geschrieben, damit sie die zusätzlichen Spalten zurückgibt, die ich benötigte. Hier ist die Abfrage, die ich geschrieben habe: </p>
<pre class="brush:php;toolbar:false;">SELECT
*,
CASE WHEN (SUM(CASE WHEN class = 'class 1' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 1',
CASE WHEN (SUM(CASE WHEN class = 'class 2' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 2',
CASE WHEN (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'
VON qa;</pre>
<p>Dies ist die Ergebnistabelle, die ich erhalte: </p>
<p>Was ich mit dieser Abfrage erreichen möchte, ist, dass, wenn ein Student den Kurs besucht hat, <code>1</code> in der Klassenspalte für alle Zeilen angezeigt wird, die zu diesem Studenten gehören. </p>
<p>Zum Beispiel ist ein Schüler mit <code>student_id</code> in der Klasse <code>1</code> In der Spalte ;/code> steht in beiden Zeilen für <code>2</code> </p>
<p>Ich habe in der Abfrage erreicht, was ich will, aber jetzt möchte ich, dass es sich um das <code>enrollment_date</code> handelt. Hier ist die endgültige Ausgabe, die ich möchte: </p>
<p>Darf ich wissen, wie ich die Abfrage ändern muss, um die endgültige Ausgabe im Screenshot oben zu erhalten? </p>
<p><strong>Zweite Frage:</strong></p>
<p>Wie Sie in der obigen Abfrage sehen können, verfügt jede Klasse über eine separate <code>CASE</code>-Anweisung, um Spalten für diese Klasse zu erstellen. Allerdings kann es in Zukunft 5,6,7,... Klassen geben, sodass ich immer dann, wenn es andere neue Klassen gibt, erneut zusätzliche <code>CASE</code>-Anweisungen hinzufügen muss.Gibt es überhaupt eine Möglichkeit, meine Abfrage so zu optimieren, dass ich nicht vier <code>CASE</code>-Anweisungen für vier verschiedene Klassen benötige, aber trotzdem Spalten für verschiedene Klassen erstellen kann (wenn es eine neue Klasse gibt). , wird es auch neue Spaltenklassen geben)? </p>
<h2>Beispieldaten</h2>
<pre class="brush:php;toolbar:false;">Tabelle qa erstellen(
student_id INT,
Klasse varchar(20),
class_end_date Datum,
enrollment_date Datum
);
In QA einfügen (Studenten-ID, Klasse, Klassenenddatum, Einschreibungsdatum)
Werte
(1, „Klasse 1“, „2022-03-03“, „2022-02-14“),
(1, „Klasse 3“, „13.06.2022“, „12.04.2022“),
(1, „Klasse 4“, „2022-07-03“, „2022-06-19“),
(2, „Klasse 1“, „2023-03-03“, „2022-07-14“),
(2, „Klasse 2“, „2022-08-03“, „2022-07-17“),
(4, „Klasse 4“, „2023-03-03“, „2022-012-14“),
(4, „Klasse 2“, „03.04.2022“, „21.03.2022“)
;</pre></p>
请参阅Pivot了解存储过程,该存储过程将根据表定义和数据生成并[可选]运行查询。
这是一个同时包含 class_end_date 和 enrollment_date 的示例 -