検索

ホームページ  >  に質問  >  本文

MySQL での CASE ステートメントの使用を最適化する

<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>
P粉463840170P粉463840170448日前564

全員に返信(2)返信します

  • P粉670107661

    P粉6701076612023-09-05 12:32:12

    テーブル定義とデータに基づいてクエリを生成し、[オプションで] 実行するストアド プロシージャについては、Pivot を参照してください。

    返事
    0
  • P粉785522400

    P粉7855224002023-09-05 00:46:12

    これは、class_end_date と enrollment_date の両方を含む例です -

    リーリー

    返事
    0
  • キャンセル返事