2015-02-15 7 views
1

Я пытаюсь ранжировать агрегированное поле в доступе, но мои усилия напрасны с ошибками на основе ссылок. Я занимаюсь ранжированием с использованием подзапроса, но проблема возникает из-за имен псевдонимов, возникающих в результате выполнения среднего значения в поле. Код, как показано ниже:Оценка агрегированного поля в запросе доступа

SELECT [Exams].[StudentID], 
     Avg([Exams].[Biology]) AS [AvgBiology], 
     (SELECT Avg(T.Biology) AS [TAvgBiology], 
       Count(*) 
     FROM [Exams] AS T 
     WHERE T.[TAvgBiology] > [AvgBiology]) 
     + 1     AS Rank 
FROM [Exams] 
GROUP BY [Exams].[StudentID] 
ORDER BY Avg([Exams].[Biology]) DESC; 

Ошибки, которые приходят о состоянии: «Вы выбрали подзапрос, который может вернуть более чем одно значение бла-бла ... пожалуйста, используйте Exist ключевое слово ..». Из приведенного выше кода я думаю, что вы получаете суть того, чего я пытаюсь достичь.

+0

Ваш запрос не иметь смысл. У вас есть функция агрегации, но не 'group by'. Измените свой вопрос с помощью выборочных данных и желаемых результатов. –

+0

Added Group By .. –

ответ

0

Я предполагаю, что ваш основной запрос:

SELECT e.StudentId Avg(e.Biology) AS AvgBiology 
FROM exams as e 
GROUP BY e.StudentId; 

(квадратные скобки не помогают мне понять запрос на всех.)

Я думаю, что следующий будет работать в Access:

SELECT e.StudentId Avg(e.Biology) AS AvgBiology, 
     (SELECT 1 + COUNT(*) 
     FROM (SELECT e.StudentId, Avg(e.Biology) AS AvgBiology 
       FROM exams as e 
       GROUP BY e.StudentId 
      ) e2 
     WHERE e2.AvgBiology > Avg(e.Biology) 
     ) as ranking 
FROM exams as e 
GROUP BY e.StudentId; 
+0

Не может иметь агрегатную функцию в 'WHERE e2.AvgBiology> Avg (e.Biology)' –

1

Начинает с базового GROUP BY запрос Gordon Linoff предлагается вычислить средний Биология за каждого StudentID.

SELECT 
    e.StudentID, 
    Avg(e.Biology) AS AvgBiology 
FROM Exams AS e 
GROUP BY e.StudentID 

Сохранить этот запрос в качестве qryAvgBiology, а затем использовать его в другом запросе, в котором вы вычислите ранга.

SELECT 
    q.StudentID, 
    q.AvgBiology, 
    (
     (
      SELECT Count(*) 
      FROM qryAvgBiology AS q2 
      WHERE q2.AvgBiology > q.AvgBiology 
     ) 
     +1 
    ) AS Rank 
FROM qryAvgBiology AS q 
ORDER BY 3; 

Например, если qryAvgBiology возвращает этот результирующий набор ...

StudentID AvgBiology 
--------- ---------- 
     1   70 
     2   80 
     3   90 

Ранжирование запроса преобразует его в этом ...

StudentID AvgBiology Rank 
--------- ---------- ---- 
     3   90 1 
     2   80 2 
     1   70 3 
+0

Я сделал это ранее, но учитывая количество запросов такого характера, которые у меня будут, мной. Есть ли способ включить все это в один запрос. Спасибо за ответ HansUp. NB: Большинство моих запросов не будут использовать фактические значения, но будут выполнять различные формы анализа производительности с учетом рейтинга. Всеохватывающим методом будет «спасение жизни». –

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