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