皆さん、こんにちは。
上のスクリーンショットに示すようなテーブルがあります。 CASE
ステートメントを使用してクエリを作成し、必要な追加の列を返すようにしました。私が書いたクエリは次のとおりです:
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;から
これは私が得た結果の表です:
このクエリで実現したいのは、学生がコースに参加した場合、その学生に属するすべての行のクラス列の下に 1
が表示されることです。
たとえば、student_id
2
を持つ生徒はクラス 1
に属しているため、クラス 1< に属します。 ;/code> 列の下の
student_id
2
の両方の行は 1
となります。
クエリで必要なことは達成できましたが、1
を使用する代わりに、クラスの enrollment_date
にしたいと考えています。これが私が望む最終的な出力です:
上のスクリーンショットの最終出力を取得するには、クエリをどのように変更すればよいか教えていただけますか?
2 番目の質問:
上記のクエリでわかるように、各クラスには、そのクラスの列を作成するための個別の CASE
ステートメントがあります。ただし、将来的にはクラスが 5、6、7、... になる可能性があるため、別の新しいクラスが存在するたびに、もう一度 CASE
ステートメントを追加する必要があります。とにかく、クエリを最適化して、4 つの異なるクラスに対して 4 つの CASE
ステートメントを使用する必要がなく、それでも (新しいクラスがある場合に) 異なるクラスの列を作成できるようにすることはできますか? 、新しい列)クラスも追加されます)?
テーブル 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」) ;
テーブル定義とデータに基づいてクエリを生成し、[オプションで] 実行するストアド プロシージャについては、Pivotを参照してください。
これは、class_end_date と enrollment_date の両方を含む例です -
リーリー