MySQL での CASE ステートメントの使用を最適化する
P粉463840170
2023-09-04 18:42:48
<p>皆さん、こんにちは。</p>
<p>上のスクリーンショットに示すようなテーブルがあります。 <code>CASE</code> ステートメントを使用してクエリを作成し、必要な追加の列を返すようにしました。私が書いたクエリは次のとおりです: </p>
<pre class="brush:php;toolbar:false;">SELECT
*、
CASE WHEN (SUM(CASE WHEN class = 'クラス 1' THEN 1 END) OVER(PARTITION BY Student_id)) >= 1 THEN 1 ELSE 0 END AS 'クラス 1'、
CASE WHEN (SUM(CASE WHEN class = 'クラス 2' THEN 1 END) OVER(PARTITION BY Student_id)) >= 1 THEN 1 ELSE 0 END AS 'クラス 2'、
CASE WHEN (SUM(CASE WHEN class = 'クラス 3' THEN 1 END) OVER(PARTITION BY Student_id)) >= 1 THEN 1 ELSE 0 END AS 'クラス 3'、
CASE WHEN (SUM(CASE WHEN class = 'クラス 4' THEN 1 END) OVER(PARTITION BY Student_id)) >= 1 THEN 1 ELSE 0 END AS 'クラス 4'
Qa;</pre>から
<p>これは私が得た結果の表です: </p>
<p>このクエリで実現したいのは、学生がコースに参加した場合、その学生に属するすべての行のクラス列の下に <code>1</code> が表示されることです。 </p>
<p>たとえば、<code>student_id</code> <code>2</code> を持つ生徒はクラス <code>1</code> に属しているため、クラス <code>1< に属します。 ;/code> 列の下の <code>student_id</code> <code>2</code> の両方の行は <code> 1</code> となります。 </p>
<p>クエリで必要なことは達成できましたが、<code>1</code> を使用する代わりに、クラスの <code>enrollment_date</code> にしたいと考えています。これが私が望む最終的な出力です: </p>
<p>上のスクリーンショットの最終出力を取得するには、クエリをどのように変更すればよいか教えていただけますか? </p>
<p><strong>2 番目の質問:</strong></p>
<p>上記のクエリでわかるように、各クラスには、そのクラスの列を作成するための個別の <code>CASE</code> ステートメントがあります。ただし、将来的にはクラスが 5、6、7、... になる可能性があるため、別の新しいクラスが存在するたびに、もう一度 <code>CASE</code> ステートメントを追加する必要があります。とにかく、クエリを最適化して、4 つの異なるクラスに対して 4 つの <code>CASE</code> ステートメントを使用する必要がなく、それでも (新しいクラスがある場合に) 異なるクラスの列を作成できるようにすることはできますか? 、新しい列)クラスも追加されます)? </p>
<h2>サンプルデータ</h2>
<pre class="brush:php;toolbar:false;">テーブル qa を作成(
Student_id INT、
クラス varchar(20)、
class_end_date 日付、
登録日の日付
);
QA に挿入 (student_id、class、class_end_date、enrollment_date)
価値観
(1、「クラス 1」、「2022-03-03」、「2022-02-14」)、
(1、「クラス 3」、「2022-06-13」、「2022-04-12」)、
(1、「クラス 4」、「2022-07-03」、「2022-06-19」)、
(2、「クラス 1」、「2023-03-03」、「2022-07-14」)、
(2、「クラス 2」、「2022-08-03」、「2022-07-17」)、
(4、「クラス 4」、「2023-03-03」、「2022-012-14」)、
(4、「クラス 2」、「2022-04-03」、「2022-03-21」)
;</pre></p>
テーブル定義とデータに基づいてクエリを生成し、[オプションで] 実行するストアド プロシージャについては、Pivot を参照してください。
これは、class_end_date と enrollment_date の両方を含む例です -
リーリー