2013-05-15 54 views
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和學生證的表格。

一旦我明白了這一點,我想最終建立它並添加更多的方法來將它們分開。

Incase你想知道爲什麼我想這樣做是因爲我們目前的調度程序不支持這種調度,我不知道什麼時候可以添加它。但即使只是這個簡單的步驟,也可以節省大量的時間。

我很欣賞任何輸入或幫助。

+4

'我需要他們是性別平衡的.. ..但沒有你的設置中的性別信息..? –

+1

性別平衡是性別歧視!如果只有我和其他人註冊,並與其餘的女性說服,我們被迫純粹基於我們的生殖器進入不同的課程!我反對:P – Wrikken

+0

對不起,忘了添加有一個字段是爲M或F的學生 – Mysteri0n

回答

0

遵循規範化原則並使用您現有的架構, 我猜你所要求的並不是你想要的

我不明白你爲什麼需要表格中的teacherID,因爲你已經有了TeacherID FK的課程表。

我覺得你需要的是一個StudentCourses表。此表將有兩個字段,studentID和courseID(courseID作爲FK到課程表和studentID到學生表。持學生證和CourseID的兩個部分的複合PK。

的樣本數據會看起來像

 StudentRegistrations 

    CourseID   StudentID 
    5007010    26352 
    5007010    26732 
    6003790    26352 

這是除非我完全誤解了,你只是要求我們寫一個SP隨機放在課程的學生。不過,我的觀點我在上面做仍然站立。

+0

你說得很好。這將工作只是我的課程和學生證。我在sql方面非常精通,但遠不是sql master。但我想用存儲過程隨機詢問學生上課,同時在課程中保持性別平衡。我只是不確定如何去做。 – Mysteri0n

+0

@ AcidBurn85 Gotcha,這是一個非常陡峭的要求,因爲它沒有自己開始,但看起來戈登試圖用他的答案來解決它 - 給這個鏡頭。 – Scotch

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四捨五入到下一個整數,並將其用於估算。這對你的目的可能已經足夠了。

而且,此解決方案中的代碼是爲了說明解決方案。它可能有句法問題。