2013-11-25 83 views
4

我需要生成SQL数据库的帮助。计算研究区域的百分比

我有两个表:

  • 学生
  • student_Subjects

学生表:

 
+------------+---------+-----------------+ 
| id  | name |area_of_study_id | 
+------------+---------+-----------------+ 
| 1   | AAA  | 1    | 
| 2   | BBB  | 2    | 
| 3   | CCC  | 1    | 
| 4   | DDD  | 3    | 
| 5   | EEE  | 4    | 
| 6   | FFF  | 1    | 
| 7   | GGG  | 2    | 
| 8   | III  | 1    | 
+------------+---------+-----------------+ 

student_subjects表:

 
+------------+-------------------+------------------+ 
| id  | student_id  | subject_id  | 
| 1   | 1     |  1   | 
| 2   | 2     |  1   | 
| 3   | 1     |  3   | 
| 4   | 1     |  2   | 
| 5   | 3     |  1   | 
| 6   | 6     |  1   | 
| 7   | 7     |  3   | 
| 8   | 4     |  6   | 
+------------+-------------------+------------------+ 

我需要找出基于students area of study一个subject's area of study。从学生表上可以看到,学生可以自由选择area of study。有时,他们可以选择与其学习领域无关的科目。因此,在这种情况下,我们需要根据已采纳主题的student percentages来计算area of studysubject

的部分输出:

 
+------------+-------------------+-----------------------------------+ 
|Total_students | subject_id |area_of_study_id | percentage  | 
+------------+-------------------+-----------------+-----------------+ 
| 3   | 1     | 1    | 75    | 
| 1   | 1     | 2    | 25    | 
| 1   | 3     | 1    | 50    | 
| 1   | 3     | 2    | 50    | 
| 1   | 2     | 1    | 100    | 
| 1   | 6     | 3    | 100    | 
+------------+-------------------+-----------------+-----------------+ 

从上面的部分输出中,我们可以看到,3名学生选择的受试者(即subject_id = 1)具有研究1的面积和一个学生是来自不同区研究(即2)。所以,我们可以说subject_id =1是从area of study = 1

如果百分比50%为一个主题。我们可以选择两个之间的任何学习领域,不管是哪一个。

预期输出:

 
+------------+-------------------+-----------------------------------+ 
|Total_students | subject_id |area_of_study_id | percentage  | 
+------------+-------------------+-----------------+-----------------+ 
| 3   | 1     | 1    | 75    | 
| 1   | 3     | 1    | 50    | 
| 1   | 2     | 1    | 100    | 
| 1   | 6     | 3    | 100    | 
+------------+-------------------+-----------------+-----------------+ 

在先进的感谢。

+0

能详细百分比如何为局部的,最终的结果计算解释一下吗? – peterm

+0

只计算一次的百分比。在最后我只是过滤部分。部分地,你可以看到4个学生选择subject_id = 1。但是,一个来自不同的学习领域。所以百分比计算:100 * 3/4 = 75和单身学生; 100 x 1/4 = 25。 – Anam

+0

@Anam:我认为如果您分别将主题名称和研究区域名称,而不是研究ID的主题ID和区域,将会更有帮助。由于数字的相似性,这非常令人困惑。 – Edper

回答

1

尝试这种方式

SELECT subject_id, area_of_study_id, total_students, percentage 
    FROM 
(
    SELECT p.subject_id, p.area_of_study_id, p.total_students, 
     p.total_students/t.total_students * 100 percentage 
    FROM 
    (
    SELECT COUNT(*) total_students, ss.subject_id, s.area_of_study_id 
     FROM students s JOIN student_subjects ss 
     ON s.id = ss.student_id 
    GROUP BY ss.subject_id, s.area_of_study_id 
) p JOIN 
    (
    SELECT ss.subject_id, COUNT(*) total_students 
     FROM students s JOIN student_subjects ss 
     ON s.id = ss.student_id 
    GROUP BY ss.subject_id 
) t ON p.subject_id = t.subject_id 
    ORDER BY percentage DESC 
) q 
    GROUP BY subject_id; 

输出:

 
| SUBJECT_ID | AREA_OF_STUDY_ID | TOTAL_STUDENTS | PERCENTAGE | 
|------------|------------------|----------------|------------| 
|   1 |    1 |    3 |   75 | 
|   2 |    1 |    1 |  100 | 
|   3 |    1 |    1 |   50 | 
|   6 |    3 |    1 |  100 | 

这里是SQLFiddle演示

+0

@Anam有帮助吗? – peterm

+0

感谢您的帮助。抱歉我当时在忙。这个查询是庞大而复杂的。我很高兴你帮助了我,节省了大量的时间。再次感谢。 – Anam