資料表:student_id,name,age,class_id,group_id
[學生id][姓名][年齡][班級id][組id]
用一條sql語句
1.求低於組平均年齡的人數比率在50%以下的那些組所在班級中高於班級平均年齡的學生
2.求組內最大年齡和最小年齡的學生既不是班級最大又不是班級最小的那些組所在班級的平均年齡
解法1:
SELECT students.name
FROM
(/*由學生集合向班級平均年齡集合進行一次投影,求出高於班級平均年齡的學生*/
SELECT students.name,students.class_id,students.group_id FROM students
INNER JOIN (/*此處求出現有學生所在的各個班級的平均年齡*/SELECT class_id,AVG(age) AS avgage FROM students GROUP BY class_id) students_1
ON students.class_id=students_1.class_id AND students.age>students_1.avgage
) students
INNER JOIN /*由高於班級平均年齡的學生集合向低於組平均年齡的人數比率在50%以下的那些組進行投影*/
(
SELECT students_0.group_id
FROM (/*現有學生所在組中每組的總人數*/select group_id,count(student_id) NumberOfGroup from students group by group_id) students_0
INNER JOIN
(/*學生集合向學生所在組的平均年齡集合進行一次投影,求出每組低於平均年齡的人數*/
SELECT students.group_id,COUNT(students.student_id) AS Number FROM students
INNER JOIN(SELECT group_id,AVG(age) AS avgage FROM students GROUP BY group_id) students_1
ON students.group_id=students_1.group_id AND students.age<students_1.avgage
GROUP BY students.group_id
) students_1
ON students_0.group_id=students_1.group_id
/*篩選出低於平均年齡人數比率在50%以下的那些組*/
where CAST(Number AS float)/CAST(NumberOfGroup AS float)<0.5
)
Groups
ON students.group_id=Groups.group_id
---------------------------------
解法2:
1.求低於組平均年齡的人數比率在50%以下的那些組所在班級中高於班級平均年齡的學生
Select * From school y Where age>(Select AVG(age) From school Where class_id=y.class_id) And class_id In (Select class_id From School x Where (Select Count(1) From school Where age<(Select AVG(age) From school Where group_id=x.group_id) And group_id=x.group_id)/(Select Count(1) From school Where group_id=x.group_id) <0.5)
2.求組內最大年齡和最小年齡的學生既不是班級最大又不是班級最小的那些組所在班級的平均年齡
Select class_id,AVG(age) From school x Where (Select Min(age) From school Where group_id=x.groupid And class_id=x.class_id)<>(Select Min(age) From school Where class_id=x.class_id) And (Select Max(age) From school Where group_id=x.groupid And class_id=x.class_id)<>(Select Max(age) From school Where class_id=x.class_id) Group By class_id