2013-04-09 4 views
0

У меня есть четыре таблицы с помощью следующей конструкции: -ORACLE AVG функция запроса

Я пытаюсь построить запрос, который будет выводить предложения, которые имеют посещаемость ниже средней посещаемости для предложений курса, к которому они принадлежат. Я построил два запроса до сих пор

Это выходы общее количество участников для каждого курса

Это выводит общее количество предложений для каждого курса.

Я думаю, что мне нужно сделать, это разделить результаты первого запроса по результатам второго запроса (что даст мне среднее количество посещений для каждого предложения каждого курса), а затем вывести только предложения с посещаемостью ниже этого результата. Я действительно изо всех сил, чтобы построить этот запрос, поэтому я в основном ищу некоторую помощь

Любая помощь очень ценится как всегда

ответ

1

Один из способов сделать это сначала найти количество участников для каждого предложения, то из этот результат набирает среднюю посещаемость для каждого курса, присоединяется к средним посещаемости к каждому связанному предложению, а затем выбирает те, где фактическая посещаемость является любовницей, чем средняя.

Это может быть сделано с помощью КТР:

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

Edit:

Oracle, кажется, требуют немного другое решение:

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

+0

@Matthew Проверьте измененное решение, которое, похоже, работает и в Oracle. –

+0

спасибо, много, только одна вещь. Я не хочу включать подробную информацию о курсах с 0 участниками, как бы отредактировать это, чтобы показывать результаты только для курсов с 1 или более участниками – Dot

Смежные вопросы