我知道这是一个旧线程。但是由于我在一个非常相似的问题上花了很多时间,并且在这里给出的以前的答案给了我很大的帮助,所以我想分享我发现的一种更快的方法。 (注意,它更复杂。)
首先制作另一个名为“Individualizer”的表。这将有一个字段包含从 1 到您需要的最高排名的数字列表。
接下来创建一个 VBA 模块并将其粘贴到其中:
'Global Declarations Section.
Option Explicit
Global Cntr
'*************************************************************
' Function: Qcntr()
'
' Purpose: This function will increment and return a dynamic
' counter. This function should be called from a query.
'*************************************************************
Function QCntr(x) As Long
Cntr = Cntr + 1
QCntr = Cntr
End Function
'**************************************************************
' Function: SetToZero()
'
' Purpose: This function will reset the global Cntr to 0. This
' function should be called each time before running a query
' containing the Qcntr() function.
'**************************************************************
Function SetToZero()
Cntr = 0
End Function
将其保存为 Module1。
接下来,像这样创建 Query1:
SELECT Table1.Dept, Count(Table1.Salesperson) AS CountOfSalesperson
FROM Table1
GROUP BY Table1.Dept;
像这样创建一个名为 Query2 的 MakeTable 查询:
SELECT SetToZero() AS Expr1, QCntr([ID]) AS Rank, Query1.Dept,
Query1.CountOfSalesperson, Individualizer.ID
INTO Qtable1
FROM Query1
INNER JOIN Individualizer
ON Query1.CountOfSalesperson >= Individualizer.ID;
像这样创建另一个名为 Query3 的 MakeTable 查询:
SELECT SetToZero() AS Expr1, QCntr([Identifier]) AS Rank,
[Salesperson] & [Dept] & [#Customers] AS Identifier, Table1.Salesperson,
Table1.Dept, Table1.[#Customers]
INTO Qtable2
FROM Table1;
如果您已经有另一个字段可以唯一标识每一行,则您不需要创建标识符字段。
运行 Query2 和 Query3 以创建表。
像这样创建名为 Query4 的第四个查询:
SELECT Qtable2.Salesperson, Qtable2.Dept, Qtable2.[#Customers], Qtable1.ID AS Rank
FROM Qtable1
INNER JOIN Qtable2 ON Qtable1.Rank = Qtable2.Rank;
Query4 返回您要查找的结果。
实际上,您可能希望编写一个 VBA 函数来运行 Query2 和 Query3,然后通过放置在方便位置的按钮调用该函数。
现在我知道这对于你给出的例子来说听起来非常复杂。但在现实生活中,我相信你的桌子比这更复杂。希望我的例子可以应用于您的实际情况。在我有超过 12,000 条记录的数据库中,这种方法是 FAR 最快的(例如:12,000 条记录需要 6 秒,而使用子查询方法对 262 条记录进行排序需要 1 分钟以上)。
对我来说真正的秘密是 MakeTable 查询,因为除非您立即将结果输出到表中,否则这种排名方法是无用的。但是,这确实限制了它可以应用于的情况。
附:我忘了提到在我的数据库中我没有直接从表中提取结果。这些记录在需要进行排名之前已经经过了一系列查询和多次计算。在我的情况下,这可能极大地导致了两种方法之间的速度差异。如果您直接从表中提取记录,您可能不会注意到几乎有那么大的改进。