50個のSQL文(MySQL版)問題22

5992 ワード

----------------------------------------------------------------------------------------
student(StuId,StuName,StuAge,StuSex)学生表
teacher(TId,Tname)教師表
course(CId,Cname,C_TId)カリキュラム
sc(SId,S_CId,Score)成績表
----------------------------------------------------------
質問二十二:以下の課程成績第3位から第6位までの学生成績表を調べる:企業管理(001)、マルクス(002)、UML(003)、データベース(004)フォーマット:[学生ID],[学生氏名]、企業管理、マルクス、UML、データベース、平均成績
SELECT stu.StuId,stu.StuName,
BM.Score AS BM,Marx.Score AS Marx,UML.Score AS UML,DB.Score AS DB,
(IFNULL(BM.Score,0)+IFNULL(Marx.Score,0)+IFNULL(UML.Score,0)+IFNULL(DB.Score,0))/
(SUM(CASE WHEN IFNULL(BM.Score,0)=0 THEN 0 ELSE 1 END)+
SUM(CASE WHEN IFNULL(Marx.Score,0)=0 THEN 0 ELSE 1 END)+
SUM(CASE WHEN IFNULL(UML.Score,0)=0 THEN 0 ELSE 1 END)+
SUM(CASE WHEN IFNULL(DB.Score,0)=0 THEN 0 ELSE 1 END)) AS AvgScore
FROM student stu
LEFT JOIN sc AS BM ON BM.SId=stu.StuId AND BM.S_CId='001'
LEFT JOIN sc AS Marx ON Marx.SId=stu.StuId AND Marx.S_CId='002'
LEFT JOIN sc AS UML ON UML.SId=stu.StuId AND UML.S_CId='003'
LEFT JOIN sc AS DB ON DB.SId=stu.StuId AND DB.S_CId='004'
GROUP BY stu.StuId
ORDER BY AvgScore DESC
LIMIT 2,4;

答えはただ参考にして、必ずしも完全に正しいとは限らなくて、もし间违いを発见してあるいはもっと良いことがあるならば、评论を歓迎して、互いに交流して、いっしょに成长します!!!