2012-05-31 2 views
0

Я создал представление, содержащее:Получение выше среднего студента из базы данных

student_full_name subject_code result 
Jennifer Higgins  CS1234   81 
Jennifer Higgins  CS1235   90 
Kal Penn    CS1234   70 
Kal Penn    CS1235   60 
Han Solo    CS1234   45 
Han Solo    CS1235   70 

Я пытаюсь получить:

  1. среднего результат каждого студента, так как, скажем, Дженнифер Хиггинс зачислена в CS1234 и CS1235. Ее средняя отметка будет 85.50.

  2. Затем знаки Дженнифер Хиггинс будут сравниваться со средней отметкой всех зачислений Итак, суммируя AVG (результат) для всех предметов.

  3. В запросе будут указаны все учащиеся, которые получают более высокие оценки.

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

SELECT student_full_name, 
     AVG(results) AS average_result 
FROM viewEnrol 
WHERE average_result > (SELECT (AVG(results)) 
          FROM viewEnrol 

GROUP BY student_full_name 

// EDIT

OUTPUT должен выглядеть. Kal Penn и Han Solo не указаны, так как они не превышают среднюю отметку. Средняя оценка всех предметов - 69,33. Хан Соло получил 57,5, а Kal Penn получил 65.

student_full_name subject_code result 
Jennifer Higgins  CS1234   85.5 

Любая помощь?

+1

Какая система баз данных и какая версия? ** SQL ** - это только * Structured Query Language * - язык, используемый многими системами баз данных, но «SQL» не является продуктом базы данных ... такие вещи могут быть специфическими для поставщиков, поэтому нам действительно нужно знать, что базы данных, которую вы используете .... –

+0

Использование студии управления базами данных microsoft, так что я думаю, ее t-sql – nfnmy

+0

Можете ли вы представить, как результат должен выглядеть как –

ответ

3

Это должно сделать работу. Первый внутренний запрос даст вам результат среднего числа всех учащихся. Пока второй даст avg для таблицы.

SELECT student_full_name 
    FROM (SELECT student_full_name, 
       AVG(results) AS average_Sresult 
      FROM viewEnrol 
      GROUP BY student_full_name) sre, 
     (SELECT (AVG(results)) tavg 
      FROM viewEnrol) ta 
    WHERE sre.average_Sresult > ta.tavg 

PS: Вы не должны принимать СРЕДНЕМ Гетлинга, а не принимать СРЕДНЕМ всех результатов.

+0

Это работает как шарм! благодаря! – nfnmy

2

Если вы хотите, чтобы фильтровать ваши результаты после агрегации (как avg), вам нужно использовать having, а не where.

Общее правило:

  • where фильтров, что сырье (не агрегированные) строки вы получаете от фактической базы данных до того агрегация происходит; и
  • having фильтрует то, что (возможно, агрегированные) строки, наконец, доставляются вам.

Нечто подобное (хотя непроверенные):

SELECT student_full_name, 
     AVG (results) AS average_result 
FROM  viewEnrol 
GROUP BY student_full_name 
HAVING AVG (results) > (SELECT AVG (results) FROM viewEnrol) 
+0

Не должен 'AVG (результаты)>' скорее быть 'average_result> 0' ? – Pateman

+0

@Pateman: no. Это даст вам ряд для тех, у кого нет ненулевого среднего. Вам нужны только ученики, чей средний уровень выше среднего. – paxdiablo

+0

Правильно, мое плохое. – Pateman

0

Получение среднего результата должно быть только вопросом фильтрации, поэтому вам не нужно ссылаться на внешний запрос при вычислении глобального среднего значения. Ваш псевдокод очень близок к тому, что вам нужно.Вероятно, вы захотите преобразовать предложение where в предложение having. Похоже, вы тоже сравниваете студентов, которые выше средних учеников, а не студентов, которые работают выше среднего. Убедитесь, что вы совершенно четко понимаете, что такое определение среднего.

Что-то в этой форме:

select student_full_name, avg(results) as avg_result 
from viewEnrol 
group by student_full_name 
having avg(results) > (
    select avg(avg_results) 
    from (
     select name, avg(results) as avg_results 
     group by student_full_name 
     ) 
    ) 
0

Каждая проблема, как решение, я создал таблицу

CREATE TABLE STUD 
(SNAME varchar(20), 
SCODE NUMBER PRIMARY KEY, 
MARKS NUMBER(4,2)) 

Вводимые значения

SNAME SCODE MARKS 
-------------------- 
SAM  1001 90 
VAS  1001 80 
SAM  1002 60 
ANAND 1001 80 
VAS  1002 70 
ANAND 1002 50 

Запрос является

SELECT SNAME,AVG(MARKS) FROM STUD GROUP BY SNAME HAVING AVG(MARKS)>= 
(SELECT MAX(MARKS) FROM STUD WHERE SNAME='VAS') 
Смежные вопросы