请求协助将3条SQL查询语句合并为单条查询语句
合并SQL查询获取课程多维度统计数据
可以通过子查询+关联的方式把三个统计合并成一条语句,同时要注意避免关联时的重复计数问题,比如学生数统计需要用COUNT(DISTINCT)来防止因关联其他表导致的重复统计。以下是最终的合并查询:
SELECT c.cname, COALESCE(a.numberOfActivites, 0) AS numberOfActivites, COALESCE(s.numberOfStud, 0) AS numberOfStud, COALESCE(sc.averageScore, 0) AS averageScore FROM course c LEFT JOIN ( SELECT course.cid, course.cname, COUNT(*) AS numberOfActivites FROM activity JOIN course ON course.cid = activity.cid GROUP BY course.cid, course.cname ) a ON c.cid = a.cid LEFT JOIN ( SELECT course.cid, course.cname, COUNT(DISTINCT student.studentid) AS numberOfStud FROM course JOIN enrolledstd ON course.cid = enrolledstd.cid JOIN student ON student.studentid = enrolledstd.studentid GROUP BY course.cid, course.cname ) s ON c.cid = s.cid LEFT JOIN ( SELECT course.cid, course.cname, AVG(score.score) AS averageScore FROM course JOIN activity ON activity.cid = course.cid JOIN score ON score.acid = activity.acid GROUP BY course.cid, course.cname ) sc ON c.cid = sc.cid ORDER BY c.cname;
关键说明:
- 用
LEFT JOIN替代内连接:确保即使某个课程没有活动、没有学生或者没有分数记录,依然能在结果中显示该课程,避免数据丢失。 COUNT(DISTINCT)统计学生数:如果直接关联所有表统计,会因为课程下的活动数导致学生记录被重复计算,用DISTINCT保证每个学生只被计数一次。COALESCE处理空值:如果某课程没有对应统计数据(比如无活动),用COALESCE把NULL替换为0,符合常规统计展示逻辑。- 按课程ID分组关联:相比仅用课程名关联,用
cid(课程ID)更准确,避免不同课程重名导致的关联错误。
内容的提问来源于stack exchange,提问作者kaiox
相关产品推荐
相关产品推荐

