2013-04-09 75 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