在Access Query中排列聚合字段

时间:2015-02-15 14:27:41

标签: sql ms-access ms-access-2013

我正在尝试对访问中的聚合字段进行排名,但我的努力是徒劳的,基于引用的错误。我使用子查询进行排名,但问题是由于在字段上执行平均而产生的别名。代码如下:

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关键字..”。 从上面的代码中我认为你得到了我想要实现的目标。

2 个答案:

答案 0 :(得分:1)

从建议的基本GROUP BY查询Gordon Linoff开始计算每个 StudentID 的平均生物

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

将该查询保存为 qryAvgBiology ,然后在另一个计算 Rank 的查询中使用它。

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

答案 1 :(得分: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;