一种方式做到这一点是,首先找到参加的人数为每个产品,然后从这个结果找到每门课程的平均出勤率,加入到每个相关产品的平均出勤率,然后选择实际出勤率高于平均值的人。
这可以用一个CTE来完成:
WITH attendee_counts AS
(SELECT c.course_id, o.offering_id,
COUNT (Student_id) AS attendees -- find attendance
FROM course c
INNER JOIN offering o
ON o.course_id = c.course_id
LEFT JOIN attendance a
ON a.offering_id = o.offering_id
GROUP BY c.course_id, o.offering_id) -- for each offering
SELECT ac.course_id, ac.offering_id,
ac.attendees, avgs.avg_attendees
FROM attendee_counts AS ac
INNER JOIN
(SELECT course_id, AVG(attendees) AS avg_attendees -- then average
FROM attendee_counts
GROUP BY course_id) AS avgs -- by course
ON avgs.course_id = ac.course_id
WHERE ac.attendees < avgs.avg_attendees;
查询(在PostgreSQL的工作)都可以在这里进行测试:http://www.sqlfiddle.com/#!1/f5b60/20/0
编辑:
甲骨文似乎需要略有不同的解决方案:
WITH attendee_counts AS
(SELECT c.course_id, o.offering_id,
COUNT (Student_id) AS attendees
FROM course c
INNER JOIN offering o ON o.course_id = c.course_id
LEFT JOIN attendance a ON a.offering_id = o.offering_id
GROUP BY c.course_id, o.offering_id)
SELECT o.course_id, o.offering_id, o.attendees,
avg(c.attendees) AS avg_attendees
FROM attendee_counts o -- connect attendance by offering
LEFT JOIN attendee_counts c
ON c.course_id = o.course_id -- to each offering of the same course
GROUP BY o.course_id, o.offering_id, o.attendees
HAVING o.attendees < avg(c.attendees);
这可以在这里测试http://www.sqlfiddle.com/#!4/e50e4/4/0(为的Oracle 11g R2)
d这触发了以下错误在我 '错误开始位于第1行中的命令: 错误在命令行:13柱:22 错误报告: SQL错误:ORA-00933:SQL命令没有正确结束 00933. 00000 - “SQL命令没有正确结束” – Dot 2013-04-09 21:12:01
@Matthew检查似乎也适用于Oracle的修改后的解决方案。 – 2013-04-09 22:35:02
非常感谢terje,只是一件事。我不想在0位参加者中包含课程的详细信息,我如何编辑此项以仅显示带有1位或更多位参加者的课程的结果 – Dot 2013-04-09 23:06:49