1

スケジュール プログラムを作成したいと考えています (それを実行するための SQL を作成し、それを実行するための php サイトを作成します)。手始めに、私の学校にいる生徒を教師に分けたいと思います。男女のバランスがとれている必要があります。つまり、各クラスで、ある性別が他の性別よりも 30% を超えないようにする必要があります。

そのため、1 年生から 5 年生までのすべてのレベルを持つ生徒のテーブルと、彼らが教えている学年を指定するフィールドを持つ教師のテーブルがあります。次に、各教師が教えるコースを含むコーステーブルを作成します。これには、クラスサイズの制限 (18 人の学生のみが許可されているなど) と、コースを教えている教師 ID を持つフィールドが含まれています。

Student Table Example:

Student_ID  Grade_Level
253486           1
365896           2
485785           3
968654           4
154278           5



Teacher Table Example:

Teacher_ID  Grade Taught
253              1
584              2
985              3
647              4
254              5

Course Table Example:

Course_ID   Class_Limit Teacher_ID
5007010      15            253
5007011      15            584
5007012      18            985
5007013      18            647
5007014      10            254

私が最終結果にしたいのは、教師ID、コースID、学生IDの3つのフィールドを持つテーブルにレコードをダンプすることです。

これを理解したら、最終的にはそれに基づいて構築し、それらを分割する方法をさらに追加したいと思います.

なぜ私がこれをやりたいのか疑問に思っているのは、現在のスケジューラがこの種のスケジューリングをサポートしていないためであり、いつ追加されるのかわかりません. しかし、この単純な手順だけでも、現在は大幅に時間を節約できます。

ご意見やご協力をお願いいたします。

4

2 に答える 2

1

これがあなたが取ることができるアプローチです。

重要なアイデアは、各クラスの男女の生徒数を数えてから割り当てることです。情報があれば、割り当ては非常に簡単です。それで、それがあると仮定します:

with magictable (
      <subquery here is nummale and numfemale in each class
     ),
     classinfo (
      select mt.*,
             sum(nummales) over (partition by grade) - 1 as endrange_male,
             sum(nummales) over (partition by grade) - nummales as startrange_male,
             sum(numfemales) over (partition by grade) - 1 as endrange_female,
             sum(numfemales) over (partition by grade) - numfemales as startrange_female
      from magictable mt
     )
select
from (select s.*,
             ROW_NUMBER() over (partition by grade, gender order by student_id) as seqnum
      from student s
     ) s join
     classinfo ci
     on (s.gender = 'M' and s.seqnum between startrange_male and endrange_male) or
        (s.gender = 'F' and s.seqnum between startrange_female and endrange_female)

したがって、これにより、割り当て情報が各クラスの男性と女性の数の計算に変わります。これを達成する他の方法があるかもしれないので、ここでおおよその答えを示します。

各学年の生徒数、男子の人数、女子の人数を数えることができます。総定員から実際の学生数を引いて、「超過」学生数を計算します。これにより、各クラスの実際のサイズが得られます。次に、これを男女比で分けます。

次のクエリは、これを行う方法を示しています。

  select c.*,
         (c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) as actsize,
         (c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) * (NumMales / NumStudents) as actMales,
         (c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) * (NumFemales / NumStudents) as actFemales
  from course c join
       teacher t
       on c.teacher_id = t.teacher_id
       (select grade, count(*) as numcourses, SUM(class_limit) as maxcapacity
        from course c join
             teacher t
             on c.teacher_id = t.teacher_id
        group by grade
       ) csum
       on t.grade = csum.grade join
       (select grade, sum(case when gender = 'M' then 1 else 0 end) as NumMales,
               sum(case when gender = 'F' then 1 else 0 end) as NumFemales,
               count(*) as NumStudents
        from s
        group by grade
       ) ssum
       on t.grade = ssum.grade;

問題は、分数の学生を扱っているため、これは概算であることです。そして悲しいことに、実際の学生は非分数のサイズでのみ提供されます。

これには、個別のサイズを計算する実際の解決策があります。代わりに、NumMales と NumFemales を次の整数に切り上げて、それを見積もりに使用します。これはおそらくあなたの目的には十分です。

そして、このソリューションのコードは、ソリューションを説明するためのものです。構文上の問題がある可能性があります。

于 2013-05-15T21:46:36.957 に答える
0

正規化の原則に従い、既存のスキーマを使用すると、あなたが求めたものは実際にはあなたが望んでいるものではないと思います.

TeacherID FK を持つコース テーブルが既にあるため、テーブルに teacherID が必要な理由がわかりません。

StudentCourses必要なのはテーブルだと思います。このテーブルには、studentID と courseID の 2 つのフィールドがあります (courseID は Course テーブルへの FK であり、studentID は Student テーブルへです。Student ID と CourseID の 2 つの部分からなる複合 PK を使用します。

サンプルデータは次のようになります

      StudentRegistrations

    CourseID            StudentID
   5007010                26352
   5007010                26732
   6003790                26352

これは、私が完全に誤解していない限りであり、学生をコースにランダムに配置するための SP を作成するように求めているだけです。それでも、私が上で述べた私のポイントはまだ有効です。

于 2013-05-15T20:03:39.580 に答える