2013-04-09 131 views
0

我有四個表與下面的結構: -ORACLE AVG功能查詢

我試圖構成將輸出產品,其具有的平均上座率低於考勤該課程的奉獻他們所屬的查詢。我已經構建兩個查詢到目前爲止

此輸出與會者的總數爲每個課程

此輸出產品爲每個課程的總數。

我認爲我需要做的是將第一個查詢的結果除以第二個查詢的結果(這將使每個課程的每次提供的平均出勤率)然後僅輸出出席的產品低於該結果。我真的很努力打造這個查詢,所以我基本上是尋找一些幫助

任何幫助深表感謝一如既往

回答

1

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

這可以用一個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)

+0

d這觸發了以下錯誤在我 '錯誤開始位於第1行中的命令: 錯誤在命令行:13柱:22 錯誤報告: SQL錯誤:ORA-00933:SQL命令沒有正確結束 00933. 00000 - 「SQL命令沒有正確結束」 – Dot 2013-04-09 21:12:01

+0

@Matthew檢查似乎也適用於Oracle的修改後的解決方案。 – 2013-04-09 22:35:02

+0

非常感謝terje,只是一件事。我不想在0位參加者中包含課程的詳細信息,我如何編輯此項以僅顯示帶有1位或更多位參加者的課程的結果 – Dot 2013-04-09 23:06:49