一種方式做到這一點是,首先找到參加的人數爲每個產品,然後從這個結果找到每門課程的平均出勤率,加入到每個相關產品的平均出勤率,然後選擇實際出勤率高於平均值的人。
這可以用一個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